2012-11-05 49 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是不需要的。