MongoDB聚合:获取引用的文档字段值

时间:2018-08-09 17:06:57

标签: mongodb mongodb-query aggregation-framework aggregate-functions

我想从引用的文档中获取字段值。 Mongodb版本是3.4。

让我们说我有2个集合foo和bar。 Foo引用了bar:

{
  "_id" : ObjectId("5b6c713ea502dea387860eba"),
  "stack" : "overflow",
  "bar" : {
    "$ref" : "bar",
    "$id" : ObjectId("5b6c70e1a502dea387860ea6"),
    "$db" : "stackoverflow"
  }
}

相应的条形文档如下所示:

{
  "_id" : ObjectId("5b6c70e1a502dea387860ea6"),
  "name" : "bar-2"
}

我尝试了以下聚合函数来归档此结果:

{
  "_id" : ObjectId("5b6c713ea502dea387860eba"),
  "stack" : "overflow",
  "barName" : "bar-2"
}

聚集功能:

db.getCollection('foo').aggregate([
  { $match: { _id: ObjectId("5b6c713ea502dea387860eba") }},
  {
    $lookup: {
        from: 'bar',
        localField: 'bar',
        foreignField: '_id',
        as: "bar"
      }
  },
  {
    $project: {
        _id: 1,
        stack: "$stack",
        barName: "$bar.name"
    }
  }

  ]).pretty()

但是我的结果是这样的

{
  "_id" : ObjectId("5b6c713ea502dea387860eba"),
  "stack" : "overflow",
  "barName" : []
}

我尝试用Google搜索它,我调查了mongodb文档,但找不到解决方案。

有什么我想念的东西吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您需要$unwind bar,而且您的localField不仅是bar.id,而且是bar

db.getCollection('foo').aggregate([
  { "$match": { "_id": ObjectId("5b6c713ea502dea387860eba") }},
  { "$lookup": {
    "from": "bar",
    "localField": "bar.id",
    "foreignField": "_id",
    "as": "bar"
  }},
  { "$unwind": "$bar" },
  { "$project": {
    "_id": 1,
    "stack": "$stack",
    "barName": "$bar.name"
  }}
])

答案 1 :(得分:0)

由于我没有找到解决问题的方法,因此找到了issue。似乎目前无法使用mongodb DBRef()字段。