2017-06-02 36 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"}}} 
])