1

我有以下收藏:收藏 A

{
    "_id" : ObjectId("5aaa3b170e26ed1eba223ba9"),
    "name" : "A1",
    "ref" : {
        "$ref" : "B",
        "$id" : ObjectId("5aaa33740e26ed1eba223ba1")
    }
}
{
    "_id" : ObjectId("5aaa3b170e26ed1eba223baa"),
    "name" : "A2",
    "ref" : {
        "$ref" : "C",
        "$id" : ObjectId("5aaa33740e26ed1eba223ba2")
    }
}

集合 B

{
    "_id" : ObjectId("5aaa33740e26ed1eba223ba1"),
    "name" : "B1"
}
...

集合 C

{
       "_id" : ObjectId("5aaa33740e26ed1eba223ba2"),
       "name" : "C1"
}
...

可以得到以下结果吗?

{
    "_id" : ObjectId("5aaa3b170e26ed1eba223ba9"),
    "name" : "A1",
    "result" : [ 
        {
            "name" : "B1"
        }
    ]
}
{
    "_id" : ObjectId("5aaa3b170e26ed1eba223baa"),
    "name" : "A2",
    "result" : [ 
        {
            "name" : "C1"
        }
    ]
}

我用 $Project 和 §Lookups 尝试过,不幸的是没有成功。租用是例子:

db.A.aggregate([
  {$project: { 
    name : 1,
    refId: {$arrayElemAt: [{$objectToArray:"$ref"},1]},
    refCol: {$arrayElemAt: [{$objectToArray:"$ref"},0]},
  }
},
  {$lookup : {
     from : "refCol.v",
     localField : "refId.v",
     foreignField : "_id",
     as : "result"
     }
  },
  {$project : {"result._id" : 0, refId : 0, refCol : 0}} 
])

在此示例中,我无法在 $lookup 函数中引用“refCol.v”字段。有人给我小费或更好的解决方案吗?

4

1 回答 1

0

您可以通过以下populate()方法实现:

const collectionA = require('../models/collectionA');

collectionA.find({}).populate({
   path: 'collectionB',
   select: {
       'name': 1,
       '_id': 0
   }
   })
 }).then((data) => {
   if (data) {
       res.send(data);
   }
}).catch((err) => {
    res.send(err);
})
于 2018-03-18T17:47:17.863 回答