【问题标题】:Mongodb aggregate: get referenced document field valueMongodb聚合:获取引用的文档字段值
【发布时间】:2019-01-17 05:50:50
【问题描述】:

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

假设我有 2 个集合 foo 和 bar。 Foo 有对 bar 的引用:

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

而对应的bar文件是这样的:

{
  "_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" : []
}

我尝试用谷歌搜索它,我查看了 mongodb 文档但无法找到解决方案。

是我遗漏了什么还是这不可能?

谢谢!

【问题讨论】:

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


    【解决方案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"
      }}
    ])
    

    【讨论】:

    • 谢谢,但我已经试过了,据我所知。有了这个查询,我开始Fetched 0 record(s) in 0ms。我还缺少什么吗?
    • 你在用猫鼬吗?因为您的数据库名称可能在这里不正确
    • 不,我目前在本地安装的 mongodb 上的 robo 3t-shell 中。但是该文档确实创建了 symfony(学说 mongodb-odm),如果您想知道的话
    • 我还看到,如果我只做 $lookup 而没有 $project$unwindbar 是一个空数组。这是预期的行为吗?或者这是否给我暗示$lookup 无法正常工作(就像你说的,可能使用不正确的数据库名称或相等)
    • 您的 bar 应该包含对象数组 [{ "_id" : ObjectId("5b6c70e1a502dea387860ea6"), "name" : "bar-2" }]... 我认为您的数据库名称不正确
    【解决方案2】:

    由于我没有找到解决问题的方法,所以我找到了issue。看来目前这对于 mongodb DBRef() 字段是不可能的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2021-08-24
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 2023-02-11
      相关资源
      最近更新 更多