2

假设我有一个包含文档的集合——</p>

{
    'name': 'Hawaiian',
    'toppings': ['ham', 'cheese', 'pineapple'],
}

或者——</p>

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

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

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

谢谢!

4

2 回答 2

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. 按值分组toppings并计算数量
  4. 找出大于 1 的值的个数
  5. 只获取价值(浇头),count不需要。
于 2012-11-05T17:58:59.070 回答
1

我会得到所有浇头的列表,然后检查

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

请注意,我在 mongo shell 中尝试过,虽然 pymongo 语法完全相同,但我不确定在哪里实现计数 - 在 pymongo 或数据库中。

[编辑]

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

于 2012-11-05T17:37:01.057 回答