如何仅从另一个集合中检索几个字段

时间:2019-01-30 12:51:25

标签: javascript node.js mongodb aggregate

我有两个收藏夹

Collection_foo:

{
    cid:'1234',
    'foo':'bar',
    some 10+ fields...
}

Collection_bar:

{
    cid:'1234',
    'foobar':'barfoo',
    some 10+ fields...
}

我想加入这个收藏集

我尝试使用$ lookup,$ unwind,$ project

aggregate([
    {
        $lookup:{
            from: 'Collection_bar',
            localField: 'cid',
            foreignField: 'cid',
            as: 'collection_foo_bar',
        }
    },
    { $unwind :'collection_foo_bar' },
    { 
        $project : {
             'foobar':'collection_foo_bar.foobar', 
             collection_foo_bar : 0 //
        }
    }
])

我也尝试过,但是出现错误

{ 
    $project : {
        'foobar':'collection_foo_bar.foobar', 
        collection_foo_bar : 0 
    }
}

现在我得到了

{
    'foobar':'barfoo'

}

我想在哪里

{
    cid:'1234',
    'foo':'bar',
    some 10+ fields...,
    'foobar':'barfoo'
}

第二个集合中只有1个字段。

1 个答案:

答案 0 :(得分:0)

请看看这个。 变体1。

db.Collection_foo.aggregate([
    {
    $lookup:{
        from: "Collection_bar",
        localField: "cid",
        foreignField:"cid",
        as: "collection_foo_bar"
    },  
    },
    { $unwind :'$collection_foo_bar' },      
   {
      $replaceRoot: { 
          newRoot: { 
              $mergeObjects: [ "$$ROOT",{foobar:"$collection_foo_bar.foobar"}] 
          } 
      }
   },   
   { $project: { collection_foo_bar: 0 } }

])

变种2

db.Collection_foo.aggregate([
    {
    $lookup:{
        from: "Collection_bar",
        localField: "cid",
        foreignField:"cid",
        as: "collection_foo_bar"
    },  
    },
    { $unwind :'$collection_foo_bar' },      
   {
      $addFields: {foobar:"$collection_foo_bar.foobar"}
   },   
   { $project: { collection_foo_bar: 0 } }
])

结果

{
    "_id" : ObjectId("5c51a1479b70d343fb47d3ae"),
    "cid" : "1234",
    "foo" : "bar",
    "f1" : 1.0,
    "f23" : 2,
    "f33" : 3,
    "foobar" : "barfoo1111"
}

其中第二个集合中的“ foobar”和第一个集合中的其他字段。