MongoDB中的聚合,不包括数组项

时间:2014-08-07 15:45:09

标签: mongodb

我需要按分类数组对这些文档进行分组,但我要从第一个Doc中排除“term3”项。 (我的情况在一个真实的应用程序中更复杂,但这个例子很合适。)

[
    {
        "_id": "1",
        "Taxonomy": [
            {
                "Key": "1", "Term": "term1"
            },
            {
                "Key": "2", "Term": "term2"
            },
            {
                "Key": "3", "Term": "term3"
            }
        ]
    },
    {
        "_id": "2",
        "Taxonomy": [
            {
                "Key": "1", "Term": "term1"
            },
            {
                "Key": "2", "Term": "term2"
            }
        ]
    },
    {
        "_id": "3",
        "Taxonomy": [
            {
                "Key": "1", "Term": "term1"
            },
            {
                "Key": "2", "Term": "term2"
            }
        ]
    }
]

由于“term3”项目,此命令生成两个节点:

{$group: {"_id" :"$Taxonomy","Posts" : { "$addToSet" : { "_id" : "$_id"}}}}

可以unwindmatch然后重新分组文档或者有一种简单的方法吗?

1 个答案:

答案 0 :(得分:3)

运行此聚合:

db.terms.aggregate([
    {$unwind:"$Taxonomy"},
    {$match:{"Taxonomy.Term":{$ne:"term3"}}},
    {$group:{_id:"$_id",Taxonomy:{$push:"$Taxonomy"}}}
])

会产生这样的结果:

{ "_id" : "2", "Taxonomy" : [ { "Key" : "1", "Term" : "term1" }, { "Key" : "2", "Term" : "term2" } ] }
{ "_id" : "3", "Taxonomy" : [ { "Key" : "1", "Term" : "term1" }, { "Key" : "2", "Term" : "term2" } ] }
{ "_id" : "1", "Taxonomy" : [ { "Key" : "1", "Term" : "term1" }, { "Key" : "2", "Term" : "term2" } ] }

如果您需要进一步分组/处理,可以添加更多阶段。如果您需要基于Key而不是Term进行排除,则可以调整$match阶段。如果您要排除term1和term2以外的所有内容,则可以将$ne更改为$in:[<list-of-values-to-keep>]