mongodb - 执行批量查询

时间:2014-02-09 16:36:29

标签: mongodb

我首先需要来自集合的查询数据,然后根据这些数据,从集合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循环中的查询到单个查询?

3 个答案:

答案 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" }
  ]
}