MongoDB - 如何通过 Id 查找文档并找到与 ID 数组匹配的文档

Posted

技术标签:

【中文标题】MongoDB - 如何通过 Id 查找文档并找到与 ID 数组匹配的文档【英文标题】:MongoDB - How to find a doc by Id and find the docs that matches with an array of ids 【发布时间】:2019-07-16 14:59:26 【问题描述】:

我有以下问题,我的收藏中有许多遵循此结构的文档


"_id": ObjectId("5c6ec80df2f9d02d08ce6b3c"),
"id": "0", 
"name": "first",
"details": "these are the details of each doc",
"relatedDocsIds": ["1","2"]

集合中不重复“id”参数。

我想获取具有相关文档 ID 的 id 的完整文档。

我给出想要从 ids 数组中获取完整相关 Doc 的文档的“id”。

所以在这个例子中,我想获取带有“0”的文档的相关文档,他的相关文档的id存储在数组“relatedDocsIds”中。

那个查询会怎么样?

我在 nodejs 后端,我需要响应是包含该查询文档的 json。

【问题讨论】:

【参考方案1】:

您应该为此使用 mongodb aggregate,与 $unwind$lookup 运算符结合使用。

$unwind 从输入文档中解构一个数组字段,为每个元素输出一个文档。

$lookup 对同一数据库中的未分片集合执行左外连接,以过滤来自“已连接”集合的文档进行处理。

这是最后的查询:

db.yourCollection.aggregate([
  
    $unwind: "$relatedDocsIds"
  ,
  
   $lookup:
       from: "yourCollection",
       localField: "relatedDocsIds",
       foreignField: "id",
       as: "relatedDocs"
    
  
])

在猫鼬中你可以这样做:

Model.aggregate([
  
    $unwind: "$relatedDocsIds"
  ,
  
   $lookup:
       from: "yourCollection",
       localField: "relatedDocsIds",
       foreignField: "id",
       as: "relatedDocs"
    
  
]).exec((err, docs) => 
  if (err) throw err;
  console.log(docs);
);

我建议不要使用这种方法,因为 mongoose 有一个 populate 方法,它可以让你做这件事,而且他们的基准测试表明它比 mongodb 聚合更快。

【讨论】:

嗨!坦克为你解答,那是什么方法?你会怎么做?【参考方案2】:

我认为最简单的方法是使用 MongoDB 查询数组运算符

MongoDB Query Arrays

MongoDB $in operator

例子:

getCollection('collectionName').find(
  relatedDocsIds: 
    $in: ['0']
  
)

【讨论】:

以上是关于MongoDB - 如何通过 Id 查找文档并找到与 ID 数组匹配的文档的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MongoDB 中查找文档、更新文档并插入新文档?

如何在 MongoDB 中查找文档、更新文档并插入新文档?

如何在mongodb中找到数组大小大于1的文档

如何使用MongoDB聚合进行分页?

按子文档 ID 查找并更新其数据

NodeJS API:通过“Id”属性将文档查找到集合中,而不是通过 Mongodb 中的“_id”默认值