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 数组匹配的文档的主要内容,如果未能解决你的问题,请参考以下文章