我有两个收藏

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

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

最佳答案

请看看这个。
变体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”和第一个集合的其他字段。

关于javascript - 如何仅从另一个集合中检索几个字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54441053/

10-12 16:23