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

Posted

技术标签:

【中文标题】Mongodb聚合:获取引用的文档字段值【英文标题】:Mongodb aggregate: get referenced document field value 【发布时间】: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" : "***"
  

而对应的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 文档但无法找到解决方案。

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

谢谢!

【问题讨论】:

【参考方案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() 字段是不可能的。

【讨论】:

以上是关于Mongodb聚合:获取引用的文档字段值的主要内容,如果未能解决你的问题,请参考以下文章

java如何实现mongodb中查询指定字段?

如何使用 mongodb 聚合添加自定义字段?

如何按小时聚合 MongoDB 文档?

在 MongoDB 的聚合管道中获取 $group 之后的输入文档中的字段

在 MongoDB 的聚合管道中获取 $group 之后的输入文档中的字段

从两个CSV文件聚合MongoDB中的文档