【问题标题】:MongoDB - combining query across mulitple collectionsMongoDB - 跨多个集合组合查询
【发布时间】:2021-11-04 22:38:20
【问题描述】:

我正在尝试弄清楚如何在 MongoDB 中进行基本连接。我读过关于做聚合的文章:https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/,但这似乎不是我想要的。

我对 NoSQL 也很陌生,所以我不确定我应该在这里使用什么。

我在 MongoDB 中有两个集合,结构如下:

数据库收集 - 员工:

{
  _id: 1,
  name: 'John Doe',
  filesAccess: {
     web: true
  },
  fileIds: [
     'fileId1',
     'fileId2'
  ]
},
{
  _id: 2,
  name: 'Bob Jones',
  filesAccess: {
     web: false
  },
  fileIds: [
     'fileId3',
     'fileId4'
  ]
}

db 集合 - 文件:

{
   _id: fileId1,
   fileMetaData: {
      location: 'NE'
   }
},
{
   _id: fileId2,
   fileMetaData: {
      location: 'NE'
   }
},
{
   _id: fileId3,
   fileMetaData: {
      location: 'SW'
   }
},
{
   _id: fileId4,
   fileMetaData: {
      location: 'SW'
   }
}

我希望能够查询拥有fileAccess.web = true 的所有员工,并获得他们的员工ID、姓名和fileMetaData.location。所有员工文件的location 将相同。所以查询只需要使用员工的第一个fileId,就可以从files集合中获取location

所以我希望我的结果应该是这样的:

{
   _id: 1,
   name: 'John Doe',
   location: 'NE'
}

您将如何在 MongoDB 中构建查询来完成此任务?我使用 Studio3T 作为我的数据库接口。非常感谢任何帮助

【问题讨论】:

    标签: mongodb nosql


    【解决方案1】:

    您可以使用此聚合查询:

    • 首先$match 只获取filesAccess.web 为真的文档。
    • 基于fileIds_id 上的值的联接。这给出了一个调用 result 的数组。
    • 然后拿到第一个位置
    • $project 输出你想要的字段。
    db.employess.aggregate([
      {
        "$match": {
          "filesAccess.web": true
        }
      },
      {
        "$lookup": {
          "from": "files",
          "localField": "fileIds",
          "foreignField": "_id",
          "as": "result"
        }
      },
      {
        "$set": {
          "result": {
            "$arrayElemAt": [
              "$result",
              0
            ]
          }
        }
      },
      {
        "$project": {
          "_id": 1,
          "name": 1,
          "location": "$result.fileMetaData.location"
        }
      }
    ])
    

    例如here

    【讨论】:

    • 这太好了,谢谢!查看您链接的示例,这似乎是我正在寻找的。我尝试将此查询放入 Studio3T 并收到错误“无法识别的管道阶段名称:'$set'”。您知道我是否需要更改某些内容才能在 Studio3T 中执行此操作?
    • 您使用的是哪个版本的 mongo? $set 是 4.2 新的,也许你可以使用 $addFields
    • 啊是的,就是这样!我刚刚通过阅读在这里找到了它:stackoverflow.com/questions/62624944/…。我在 4.0.15 所以就是这样。非常感谢,我从中学到了很多!
    猜你喜欢
    • 2019-05-09
    • 2012-05-11
    • 2011-09-24
    • 2020-07-17
    • 1970-01-01
    • 2016-05-02
    • 2016-09-27
    • 1970-01-01
    相关资源
    最近更新 更多