2014-10-30 3 views
0

У меня есть коллекция MongoDB, который имеет документ в следующем формате:

result of MyCollection.find({"_id": "20141029"}) 

{ 
    "_id" : "20141029", 
    "portfolio_returns" : [ 
     {  
      "data" : [ 
       { 
        "report" : { 
         "open" : { 
          "returns_rs" : 398.8 
         }, 
         "both" : { 
          "returns_rs" : 1054.800 
         } 
        }, 
        "portfolio" : "Mystocks" 
       } 
      ], 
      "user" : "[email protected]" 
     }, 
     { 
      "data" : [ 
       { 
        "report" : { 
         "open" : { 
          "returns_rs" : 5000 
         }, 
         "both" : { 
          "returns_rs" : 5500 
         } 
        }, 
        "portfolio" : "pff" 
       } 
      ], 
      "user" : "[email protected]" 
     } 
    ], 

'portfolio_stock_gain_or_loss': [ 
     { 
      "data" : [ 
       { 
        "portfolio" : "gm", 
        "stocks" : [ ] 
       } 
      ], 
      "user" : "[email protected]" 
     }, 
     { 
      "data" : [ 
       { 
        "portfolio" : "Mystocks", 
        "stocks" : [ 
         { 
          "open" : { 
           "returns_rs" : 9144 
          }, 
          "scripcode" : "532540", 
          "both" : { 
           "returns_rs" : 9426.75 
          } 
         }, 
         { 
          "open" : { 
           "returns_rs" : 254.80 
          }, 
          "scripcode" : "500790", 
          "both" : { 
           "returns_rs" : 254.80 
          } 
         } 
        ] 
       } 
      ], 
      "user" : "[email protected]" 
     }, 
     { 
      "data" : [ 
       { 
        "portfolio" : "pff", 
        "stocks" : [ 
         { 
          "open" : { 
           "returns_rs" : 4000 
          }, 
          "scripcode" : "500790", 
          "both" : { 
           "returns_rs" : 8500 
          } 
         }, 
         { 
          "open" : { 
           "returns_rs" : 0 
          }, 
          "scripcode" : "533151", 
          "both" : { 
           "returns_rs" : 0 
          } 
         } 
        ] 
       } 
      ], 
      "user" : "[email protected]" 
     } 
    ] 
} 

Мой вопрос, как я могу отфильтровать данные из этого doccument, которые имеют «portfolio_stock_gain_or_loss.data. stocks.open.returns_rs "больше 1000, используя pymongo.

Ожидая из положить является

{ 
    "_id" : "20141029", 

'portfolio_stock_gain_or_loss': [ 

     { 
      "data" : [ 
       { 
        "portfolio" : "Mystocks", 
        "stocks" : [ 
         { 
          "open" : { 
           "returns_rs" : 9144 
          }, 
          "scripcode" : "532540", 
          "both" : { 
           "returns_rs" : 9426.75 
          } 
         } 


        ] 
       } 
      ], 
      "user" : "[email protected]" 
     }, 
     { 
      "data" : [ 
       { 
        "portfolio" : "pff", 
        "stocks" : [ 
         { 
          "open" : { 
           "returns_rs" : 4000 
          }, 
          "scripcode" : "500790", 
          "both" : { 
           "returns_rs" : 8500 
          } 
         }, 

        ] 
       } 
      ], 
      "user" : "[email protected]" 
     } 
    ] 
} 

Любые идеи, как я могу это сделать на существующих данных, или мне нужно менять формат?

Большое спасибо

+0

Если вы хотите взять существующий документ и возвращать только элементы вложенного массива, которые <= 1000, вам нужно будет сделать фильтрацию на стороне клиента так как в MongoDB нет возможности сделать это. – wdberkeley

ответ

2

Привет ваши Mongo документы слишком вложенными Я думаю, если это возможно, вы должны перестроить свои Монго документы. В противном случае, если вы хотите продолжить работу с такими же документами, то агрегирование mongo поможет вам решить вашу проблему. Я пишу следующее агрегацию Монго Я думаю, что это решит вашу проблему

db.MyCollection.aggregate([ 
           {"$unwind":"$portfolio_stock_gain_or_loss"}, 
           {"$unwind":"$portfolio_stock_gain_or_loss.data"}, 
           {"$unwind":"$portfolio_stock_gain_or_loss.data.stocks"}, 
           {"$project":{"openStock":"$portfolio_stock_gain_or_loss.data.stocks.open","data":"$portfolio_stock_gain_or_loss.data"}}, 
           {"$match": {"openStock.returns_rs":{"$gt":1000}}} ]).pretty() 
Смежные вопросы