我有一个函数,向它传递一个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,然后查询我的设计集合以查看是否在包含ID的Items数组中存在对象。
如果该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 } ]
$project
通过该_id
表达式添加一个阶段,该阶段用于对查询进行分组。
优化:以具有$match
对uid
之前的平仓array
项目。(主要是为了减少管道中下一阶段的文档)。
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"}]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句