MongoDB在数组中查找重复的值

时间:2012-11-05 17:25:01

标签: mongodb pymongo

假设我有一个包含 -

等文档的集合
{
    'name': 'Hawaiian',
    'toppings': ['ham', 'cheese', 'pineapple'],
}

或者 -

{
    'name': 'Peperonni',
    'toppings': ['cheese', 'pepperoni'],
}

如何获取出现在多个文档中的所有topping的列表?因此,对于上面的两个文档,它是cheese

理想情况下尽可能“接近”数据库 - 我知道我可以获得distinct所有配件的列表,然后在应用程序级别遍历所有文档,但这太贵了。 / p>

谢谢!

2 个答案:

答案 0 :(得分:5)

虽然查询很长,但你可以看看。 这是mongodb 2.2的聚合框架

db.test2.aggregate({$project:{"toppings":1, "_id":0}}, {$unwind:"$toppings"}, {$group:{"_id":"$toppings", count:{$sum:1}}}, {$match:{count:{$gt:1}}}, {$project:{"_id":1}})

{ "result" : [ { "_id" : "cheese" } ], "ok" : 1 }

解释我的查询步骤:

  1. 只想要toppings字段
  2. 展开toppings
  3. 中的所有值
  4. toppings中的值分组并计算数字
  5. 查找大于1的值的数字
  6. 仅获取价值(浇头),不需要count

答案 1 :(得分:1)

我会得到所有配料的清单,然后检查

db.coll.find({"topping": topping}).count() > 1

请注意,我在mongo shell中尝试了这个,虽然pymongo语法完全相同,但我不确定计数的实现位置 - 在pymongo或数据库中。

[编辑]

pymongo似乎将count()委托给mongodb,因此计数操作不是完整查询,而是由数据库执行。