Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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
需要在mongodb中使用自定义结果填充块中的所需结果_Mongodb_Mongoose_Mongo Shell - Fatal编程技术网

需要在mongodb中使用自定义结果填充块中的所需结果

需要在mongodb中使用自定义结果填充块中的所需结果,mongodb,mongoose,mongo-shell,Mongodb,Mongoose,Mongo Shell,我有四个收款人、其他详细信息、职业详细信息、银行详细信息,如下所述 person =>[ { id : 1, name : 'john', other_details : 1023 }, { id : 2, name : 'mark', other_details : 99 } ] other_details => [ { id: 1023, married: false, occupation_details: 144,

我有四个收款人、其他详细信息、职业详细信息、银行详细信息,如下所述

person =>[
{
   id : 1,
   name : 'john',
   other_details : 1023
},
{
   id : 2,
   name : 'mark',
   other_details : 99
}
]


other_details => [
{
   id: 1023,
    married: false,
    occupation_details: 144,
    bank_details : 10
},
{
   id: 99,
    married: true,
    occupation_details: 45,
    bank_details : 11
}
]

occupation_details => [
{
   id: 144,
    comp_name : 'oscorp inc.'
},
{
   id: 45,
    comp_name : 'tesla inc.'
}
]

bank_details => [
{
   id: 10,
    bank : 'Bank of canada'
},
{
   id: 11,
    bank : 'Peoples bank of canada'
}
]
我正在使用mongoose库和nodejs

 // id = 1
    person.findById(id).populate({
                            path: 'other_details',
                            populate: [
                                {
                                    path: 'occupation_details'
                                },
                                {
                                    path: 'bank_details'
                                }
                            ]
                        })
因此,上述查询的结果如下所示 =>

但出于某些原因,我希望得到如下结果

{
   id : 1,
   name : 'john',
   other_details : {
      id: 1023,
      married: false,
      occupation_details: {
        id: 144,
        comp_name : 'oscorp inc.'
      },
      bank_details : 10,
      custom_bank_details : {
        id: 10,
        bank : 'Bank of canada'
      }
   }
}
我需要的更改如下:
bank\u details
对象应该存在id,并且来自其他集合的填充的
bank\u details
数据应该以其他对象名称作为
custom\u bank\u details

bank_details : 10,
custom_bank_details : {
            id: 10,
            bank : 'Bank of canada'
          }
更新:

您可以使用virtual将银行详细信息填充到新字段中。差不多

OtherDetailsSchema.virtual('custom_bank_details', {
  ref: 'BankDetails',
  localField: 'bank_details',
  foreignField: '_id',
  justOne: true
});

Person.findById(id).populate({
    path: 'other_details',
    populate: [
      {path: 'occupation_details'},
      {path: 'custom_bank_details'}
]})
person.aggregate([
  {"$lookup":{
    "from":"other_details",
    "let":{"other_details":"$other_details"},
    "pipeline":[
      {"$match":{"$expr":{"$eq":["$id","$$other_details"]}}},
      {"$lookup":{
        "from":"occupation_details",
        "localField":"occupation_details",
        "foreignField":"id",
        "as":"occupation_details"
      }},
      {"$unwind":"$occupation_details"},
      {"$lookup":{
        "from":"bank_details",
        "localField":"bank_details",
        "foreignField":"id",
        "as":"custom_bank_details"
      }},
      {"$unwind":"$custom_bank_details"},
    ],
    "as":"other_details"
   }},
   {"$unwind":"$other_details"}
 ])
原创的

我不是mongoose用户,所以我不确定是否可以填充到新的字段名。如果可行,您可以很容易地通过使用聚合和查找来实现

差不多

OtherDetailsSchema.virtual('custom_bank_details', {
  ref: 'BankDetails',
  localField: 'bank_details',
  foreignField: '_id',
  justOne: true
});

Person.findById(id).populate({
    path: 'other_details',
    populate: [
      {path: 'occupation_details'},
      {path: 'custom_bank_details'}
]})
person.aggregate([
  {"$lookup":{
    "from":"other_details",
    "let":{"other_details":"$other_details"},
    "pipeline":[
      {"$match":{"$expr":{"$eq":["$id","$$other_details"]}}},
      {"$lookup":{
        "from":"occupation_details",
        "localField":"occupation_details",
        "foreignField":"id",
        "as":"occupation_details"
      }},
      {"$unwind":"$occupation_details"},
      {"$lookup":{
        "from":"bank_details",
        "localField":"bank_details",
        "foreignField":"id",
        "as":"custom_bank_details"
      }},
      {"$unwind":"$custom_bank_details"},
    ],
    "as":"other_details"
   }},
   {"$unwind":"$other_details"}
 ])
工作示例