2011-07-12 9 views
2

私はchartのMongoDBのpython文書に配列から要素の位置を取得

{ 
    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) 
    ] 
} 

と呼ばれるコレクション内のデータをランク付けするいくつかのアイテムを格納するのpython +のMongoDBを使用今私の問題は、私は歴史のランキングを作りたい、ですitemAのグラフ。そしてthe $ positional operatorによると、クエリは次のようなものでなければなりません:

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

$オペレータは動作しません。

他の解決策はありますか?

答えて

3

位置演算子はupdate(...)呼び出しでのみ使用され、配列内の位置を返すために使用することはできません。

しかし、あなたはちょうどあなたが必要なものはPythonの内から、配列内の位置を計算するためにフィールドを制限するfield projectionを返さ使用することができます。

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

関連する問題