我有一个集合,其中每个文档都有一个子文档数组,这些子文档的属性(子子文档)可能为空。
我想获取所有子文档,然后创建一个包含一些我感兴趣的属性的新文档。
例如
data
{subs: [{subsub: null}, {subsub: {a: 'a', b: 'b'}}, {subsub: {a: 'c', b: 'd'}}]},
{subs: [{subsub: null}, {subsub: {a: 'e', b: 'f'}}, {subsub: {a: 'g', b: 'h'}}]},
result
[{a; 'a'}, {a: 'c'}, {a: 'e'}, {a: 'g'}]
因此,我想将子子文档投影到一个更简单的结构中,查找所有不为null的子文档(然后,我想将其汇总为SQL中的简单GROUP BY
)。
答案 0 :(得分:1)
您可以使用以下汇总
db.collection.aggregate([
{ "$unwind": "$subs" },
{ "$match": { "subs.subsub": { "$ne": null }}},
{ "$group": {
"_id": null,
"data": { "$addToSet": { "a": "$subs.subsub.a" }}
}},
{ "$unwind": "$data" },
{ "$replaceRoot": { "newRoot": "$data" }}
])
或
db.collection.aggregate([
{ "$unwind": "$subs" },
{ "$match": { "subs.subsub": { "$ne": null }}},
{ "$group": { "_id": "$subs.subsub.a" }},
{ "$project": { "a": "$_id", "_id": false }}
])