【发布时间】: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会查询数组中对象内的对象?