MongoDB 3.4 MongoDBRef使用.NET MongoDB驱动程序解除引用

时间:2018-03-16 13:02:05

标签: mongodb mongodb-query aggregation-framework dbref

我有以下收藏: 收集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"
}
...

Collection 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”字段。 给我一个小费或更好的解决方案吗?

1 个答案:

答案 0 :(得分: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);
})