【问题标题】:Node MongoDB Batch Find?节点 MongoDB 批量查找?
【发布时间】:2019-10-10 04:02:34
【问题描述】:

我有一个函数,我将一个 ID 数组传递给它。我想要做的基本上是检查是否有任何 ID。

很遗憾,我无法执行以下操作,因为.find() 必须与另一个操作结合使用。

有没有办法批量查找?每个数组将包含 100 个 ID,并且会有很多这样的查询,所以我宁愿不逐个进行。

try {
    const bulk = db.collection('designs').initializeUnorderedBulkOp();
    ids.forEach(a => {
        bulk.find({"items.meta.id": a})
    });
    const results = await bulk.execute();
    console.log(results)
} catch (e) {
    console.log(e)
}

为了清晰:

我使用 Mongo 作为我的 Firebase 数据的索引以允许搜索功能。 每个设计文档都包含一个名为 Items 的数组,其中“item”是一个包含关键项目数据的对象,例如 ID、名称、平台和一个名为 meta 的对象。元对象包含不同的信息,具体取决于平台。

我需要做的是一次发送超过 100 个 id,然后查询我的设计集合以查看 items 数组中是否有包含该 id 的对象。

如果该 ID 存在于 items.meta.id 字段中,那么我只需将该 ID 推送到一个新数组中,并在查询完所有 100 个 ID 后,将存在的 ID 数组作为响应发送回

编辑:

我现在有以下查询按预期工作,但是在 Node 中执行此操作时,它仍然返回整个文档

https://mongoplayground.net/p/EM9VTs7YYIj

还有我的代码

    const results = await collection.aggregate({
        $unwind:  '$items'
    }, {
        $match: {
            'items.meta.id': {
                $in: ids
            },
            'uid': uid
        }
    }, {
        $group: {
            '_id': '$items.meta.id'
        }
    }).toArray()

    console.log(results)

返回:

[ { _id: 5d9378a333247165d8ea6f22,
    id: 'OczQL9Blwx79ZXtJcgrV',
    name: 'Brewdolf',
    nameci: 'brewdolf',
    uid: '1uD82gAXORYsyimX5Dw23DDAimx1',
    selected_preview_image:
     'designs/1uD82gAXORYsyimX5Dw23DDAimx1/OczQL9Blwx79ZXtJcgrV/images/preview_BrewDolf.png',
    items:
     { active: true,
       id: 'Nz36jpTaJCjp3nsAqsXA',
       platform: 'a',
       price: '1645',
       title:
        'Brewdolph Funny Drinking Reindeer Christmas Craft Beer T-Shirt',
       meta: [Object] },
    tags: null } ]

【问题讨论】:

  • 您能分享您的架构和示例输入数组吗?
  • 没有批量查找。批处理操作面向写入操作。在谈论解决方案之前,最好先说明您的用例是什么,以及您要达到的目标是什么。
  • @kevinadi 我已经用我想要实现的目标更新了这个问题。希望这可以解决问题
  • @K20GH 正如你已经说过的,没有单独的bulk.find 查询。作为一个选项,为什么不创建ids 的列表array 以匹配并与$in 进行聚合
  • 我要查询的ID已经在数组中了。我没想到$in 会查询数组中对象内的对象?

标签: node.js mongodb


【解决方案1】:

通过用于在查询中分组的 _id 表达式添加一个$project 阶段应该可以做到。

优化:array 的项目展开之前将 $match 放在 uid 上。 (主要是为了减少流水线中下一阶段的文档)。

const results = await db
  .collection("target_collection")
  .aggregate(
    {
      $match: {
        uid: uid
      }
    },
    {
      $unwind: "$items"
    },
    {
      $match: {
        "items.meta.id": {
          $in: ids //array
        }
      }
    },
    {
      $group: {
        _id: "$items.meta.id"
      }
    },
    {
      $project: {
        "_id": 1
      }
    }
  )
  .toArray();

结果(演示):

[{"_id":"gop"},{"_id":"foo"}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2011-10-25
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多