Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在mongodb中填充聚合查找后返回的子文档?_Node.js_Mongodb_Mongoose_Mongodb Query_Aggregation Framework - Fatal编程技术网

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

Node.js 如何在mongodb中填充聚合查找后返回的子文档?,node.js,mongodb,mongoose,mongodb-query,aggregation-framework,Node.js,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我在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中运

我在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:{
从:“B”,
let:{refToA:$\u id},
管道:[
{
$match:{
$expr:{$eq:[“$refToA”,“$$refToA”]}
}
},
{
$lookup:{
从:“C”,
localField:“引用数组”,
foreignField:“\u id”,
as:“引用数组”
}
}
],
as:“B收集”
}
}
]);

您能看看这个相关问题吗?