我需要按分类数组对这些文档进行分组,但我要从第一个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"}}}}
可以unwind
,match
然后重新分组文档或者有一种简单的方法吗?
答案 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>]
。