2012-11-05 47 views
2

说我有一个文档的集合喜欢 -MongoDB中找到一个数组repeteated值

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

或 -

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

我怎样才能出现在以上所有topping s的列表一个文件?所以,对于上面的两个文件,它应该是cheese

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

谢谢!

回答

1

我会得到所有配料的列表,然后检查

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

注意,我在蒙戈外壳尝试这样做,并且在pymongo语法是完全一样的,我不知道计数的实现 - 在pymongo或数据库中。

[编辑]

pymongo似乎委派的计数()来的MongoDB,从而代替一个完整的查询,计数操作是由数据库来执行。

+0

我假设这是在循环所有'浇头'的循环内 - 在我的情况下比萨饼和浇头的列表是可笑的长 - 它需要太长时间来计算。我希望这可以在DB(MapReduce,也许?) – user1569050

+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. 集团通过值toppings和计数
  4. 查找大于1的值的数字
  5. 获得唯一的价值(浇头),count是不需要的。