繁体   English   中英

如何填充 mongodb 中聚合查找后返回的子文档?

[英]How to populate the sub-documents returned after aggregate lookup in mongodb?

我在 mongodb 中有以下三个模式。

const A = new Schema({
  labelA: String
})

const B = new Schema({
  labelB: String
  refToA: {Schema.Types.ObjectId, ref: 'A'}
  refToCArray: [{Schema.Types.ObjectId, ref: 'C'}]
})

const C = new Schema({
  labelC: String
})

我在 A 中运行以下聚合查询以附加一个名为“BCollection”的字段,该字段包含来自 B 的与 A 的 id 匹配的记录。

const ACollection = await A.aggregate([
  { $match: { labelA: 'LabelA1' } },
  {
    $lookup: {
      from: 'B',
      localField: '_id',
      foreignField: 'refToA',
      as: 'BCollection',
    },
  },
])

我的问题是附加的 B 文档在“refToCArray”字段中包含 C 的 ID。 我想用 C 中的实际内容“填充”或替换这些 ID。 我怎么做。?

例子:

// Documents in A:
{_id: 'A_id1', labelA: 'LabelA1'}
{_id: 'A_id2', labelA: 'LabelA2'}

// Documents in B: 
{_id: 'B_id1', labelB: 'LabelB1', refToA: 'A_id1', refToCArray: ['C_id1']}
{_id: 'B_id2', labelB: 'LabelB2', refToA: 'A_id1', refToCArray: ['C_id1']}
{_id: 'B_id3', labelB: 'LabelB3', refToA: 'A_id1', refToCArray: ['C_id1']}
{_id: 'B_id4', labelB: 'LabelB4', refToA: 'A_id2', refToCArray: ['C_id1']}

// Documents in C
C1 {_id: 'C_id1', labelC: 'LabelC'}

上面的查询返回以下内容:

[{
  _id: 'A_id1',
  labelA: 'LabelA1'
  BCollection: [
    {_id: 'B_id1', labelB: 'LabelB1', refToA: 'A_id1', refToCArray: ['C_id1']},
    {_id: 'B_id2', labelB: 'LabelB2', refToA: 'A_id1', refToCArray: ['C_id1']},
    {_id: 'B_id3', labelB: 'LabelB3', refToA: 'A_id1', refToCArray: ['C_id1']}
  ]
}]

到目前为止,我的查询很好,但 refToCArray 包含 Id 列表:C_id1。 我想得到如下结果:

  [{
      _id: 'A_id1',
      labelA: 'LabelA1'
      BCollection: [
        {_id: 'B_id1', labelB: 'LabelB1', refToA: 'A_id1', refToCArray: [{_id: 'C_id1', labelC: 'LabelC'}]},
        {_id: 'B_id2', labelB: 'LabelB2', refToA: 'A_id1', refToCArray: [{_id: 'C_id1', labelC: 'LabelC'}]},
        {_id: 'B_id3', labelB: 'LabelB3', refToA: 'A_id1', refToCArray: [{_id: 'C_id1', labelC: 'LabelC'}]}
      ]
    }]

尝试这个:

db.A.aggregate([
    {
        $lookup: {
            from: "B",
            let: { refToA: "$_id" },
            pipeline: [
                {
                    $match: {
                        $expr: { $eq: ["$refToA", "$$refToA"] }
                    }
                },
                {
                    $lookup: {
                        from: "C",
                        localField: "refToCArray",
                        foreignField: "_id",
                        as: "refToCArray"
                    }
                }
            ],
            as: "BCollection"
        }
    }
]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM