我首先需要来自集合的查询数据,然后根据这些数据,从集合b中查询。如:
For each id queried from a
query data from b where "_id" == id
在SQL中,这可以通过连接表a&来完成。 b单一选择。但是在mongodb中,它需要做多查询,看起来效率低下,不是吗?或者它只能通过2个查询来完成?(一个用于a,另一个用于b,而不是1加n)我知道NoSQL不支持join,但是有没有办法批量执行for循环中的查询到单个查询?
答案 0 :(得分:11)
你需要分两步完成。
查看允许传递$in
数组的_id
运算符(reference)。许多人会建议你分批进行1000 _id
秒。
db.myCollection.find({ _id : { $in : [ 1, 2, 3, 4] }})
答案 1 :(得分:0)
这很简单,对于每个id不需要进行太多的数据库调用,效率非常低,可以执行一个查询,该查询将通过一次使用<返回一次,返回与每个id相关的所有文档。 MongoDB中的strong> $ in 运算符,它与SQL中的 in 语法同义,因此例如,如果您需要一次性查找5个id的文档,则
const ids = ['id1', 'id2', 'id3', 'id4', 'id5'];
const results = db.collectionName.find({ _id : { $in : ids }})
这将使您一次获得所有相关文档。
答案 2 :(得分:0)
这基本上是 SQL 用语中的 join
,您可以在 mongo 中使用名为 $lookup
的聚合查询来完成。
例如,如果您在集合中有一些类型,如下所示:
interface IFoo {
_id: ObjectId
name: string
}
interface IBar {
_id: ObjectId
fooId: ObjectId
title: string
}
然后用这样的聚合查询:
await db.foos.aggregate([
{
$match: { _id: { $in: ids } } // query criteria here
},
{
$lookup: {
from: 'bars',
localField: '_id',
foreignField: 'fooId',
as: 'bars'
}
}
])
可能会产生这样的结果对象:
{
"_id": "foo0",
"name": "example foo",
"bars": [
{ _id: "bar0", "fooId": "foo0", title: "crow bar" }
]
}