MongoDB中的子子文档投影联盟

时间:2019-07-09 13:42:56

标签: mongodb

我有一个集合,其中每个文档都有一个子文档数组,这些子文档的属性(子子文档)可能为空。

我想获取所有子文档,然后创建一个包含一些我感兴趣的属性的新文档。

例如

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)。

1 个答案:

答案 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" }}
])

MongoPlaygound

db.collection.aggregate([
  { "$unwind": "$subs" },
  { "$match": { "subs.subsub": { "$ne": null }}},
  { "$group": { "_id": "$subs.subsub.a" }},
  { "$project": { "a": "$_id", "_id": false }}
])

MongoPlayground