2017-06-02 35 views
0

我正試圖調整MongoDB上的聚合命令,以便忽略給定字段的重複項。這裏是一個示例文件:如何調整mongo聚合以忽略不相關字段中的重複項

{ 
    "_id" : ObjectId("xxx"), 
    "dev_type" : "Foo" 
    "should_be_unique" : "abcdefg" 
} 

現在我的代碼搜索各種「dev_types」的計數。我希望保持該功能不變,同時減少計數,使其不會計入字段「should_be_unique」中的重複項。

我現有的Python代碼看起來是這樣的:

result_set = db.aggregate([ 
    {"$match": match_condition}, 
    {"$group": {"_id": {"dev_type": "$dev_type"}, 
       "total": {"$sum": 1}}}, ]) 

這將返回此類結果:

{ "_id" : { "dev_type" : "Foo" }, "total" : 2 } 
{ "_id" : { "dev_type" : "Bar" }, "total" : 7 } 

我已經嘗試了幾個選項,但對我最好的,我可以」弄清楚最簡單的方法來改變這樣的查詢,同時也消除重複。這個想法是,如果兩個文檔具有相同的「should_be_unique」值,並且都將「dev_type」設置爲「Bar」,那麼「Bar」的總數將是6而不是7,這是由於重複造成的。

這似乎是Mongo足夠常見的情況,所以我希望有一個簡單的方法來調整這個查詢,以便它產生所需的結果。任何援助非常感謝。

回答

1

您可以使用$addToSet$group階段,接着是$project$size積累唯一should_be_unique值來計算的值。

喜歡的東西

db.collection.aggregate([ 
    {"$group": {"_id": {"dev_type": "$dev_type"},"unique": {"$addToSet": "$should_be_unique"}}}, 
    {"$project": { "total": {"$size": "$unique"}}} 
])