如何填充mongodb中聚合查找后返回的子文档? [英] How to populate the sub-documents returned after aggregate lookup in mongodb?

查看:82
本文介绍了如何填充mongodb中聚合查找后返回的子文档?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have the following three schemas in 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 匹配的记录.

I run following aggregation query in A to attach a field called 'BCollection' which contains records from B matching the id of A.

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

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

My problem is that the attached B documents contain Id of C in 'refToCArray' field. I want to 'populate' or replace those ids with the actual contents from C. How do I do that.?

示例:

// 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'}

以上查询返回以下内容:

The above query returns the following:

[{
  _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.我想得到如下结果:

The query so far i good but refToCArray contains list of Ids: C_id1. I want to get results as below:

  [{
      _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"
        }
    }
]);

这篇关于如何填充mongodb中聚合查找后返回的子文档?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆