mongodb python从文档中的数组中获取元素位置

时间:2011-07-12 02:18:29

标签: python mongodb nosql

我使用python + mongodb将一些项目排名数据存储在名为chart的集合中

{
  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制作一份历史排名图表。根据{{​​3}},查询应该是这样的:

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

$运算符不起作用。

对此有任何其他可能的解决方案吗?

1 个答案:

答案 0 :(得分: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]

在这个(不可否认的微不足道的)例子中,只返回一个字段子集可能没有太大的好处;但是,如果您的文档特别大,那么可能会显示性能改进。