2011-07-12 122 views
2

我使用Python + MongoDB中存儲一些項目被稱爲集合中的排名數據chartMongoDB的蟒蛇得到一個文件

{ 
    date: date1, 
    region: region1, 
    ranking: [ 
    { 
     item: bson.dbref.DBRef(db.item.find_one()), 
     price: current_price, 
     version: '1.0' 
    }, 
    { 
     item: bson.dbref.DBRef(db.item.find_another_one()), 
     price: current_price, 
     version: '1.0' 
    }, 
    .... (and the array goes on) 
    ] 
} 

現在我的問題是,我想打一個歷史排名中從一個數組元素位置圖表爲itemA。而根據the $ positional operator,查詢應該是這樣的:

db.chart.find({'ranking.item': bson.dbref.DBRef('item', itemA._id)}, ['$']) 

而且$操作不起作用。

任何其他可能的解決方案?

回答

3

$位置運算符僅用於update(...)調用中,不能用它來返回數組中的位置。

但是,您可以使用field projection限制字段返回的只是那些你需要從內Python的計算數組中的位置:

db.foo.insert({ 
'date': '2011-04-01', 
'region': 'NY', 
'ranking': [ 
{ 'item': 'Coca-Cola', 'price': 1.00, 'version': 1 }, 
{ 'item': 'Diet Coke', 'price': 1.25, 'version': 1 }, 
{ 'item': 'Diet Pepsi', 'price': 1.50, 'version': 1 }, 
]}) 

db.foo.insert({ 
'date': '2011-05-01', 
'region': 'NY', 
'ranking': [ 
{ 'item': 'Diet Coke', 'price': 1.25, 'version': 1 }, 
{ 'item': 'Coca-Cola', 'price': 1.00, 'version': 1 }, 
{ 'item': 'Diet Pepsi', 'price': 1.50, 'version': 1 }, 
]}) 

db.foo.insert({ 
'date': '2011-06-01', 
'region': 'NY', 
'ranking': [ 
{ 'item': 'Coca-Cola', 'price': 1.00, 'version': 1 }, 
{ 'item': 'Diet Pepsi', 'price': 1.50, 'version': 1 }, 
{ 'item': 'Diet Coke', 'price': 1.25, 'version': 1 }, 
]}) 

def position_of(item, ranking): 
    for i, candidate in enumerate(ranking): 
      if candidate['item'] == item: 
        return i 
    return None 

print [position_of('Diet Coke', x['ranking']) 
     for x in db.foo.find({'ranking.item': 'Diet Coke'}, ['ranking.item'])] 

# prints [1, 0, 2] 

在這(誠然平凡)例如,只返回一個子集的領域可能沒有多大益處;但是,如果您的文檔特別大,則可能會提高性能。

+0

謝謝dcrosta。你的回答給了我一個想法:我可以使用MongoDB map-reduce直接在mongodb服務器中找到位置:D – est