我有一堆我想要插入的特定产品ids的记录。根据以前的计算,我希望记录该产品在当前周/年中的类型。
问题是,除了一次一次之外,我找不出一种方法来做这件事。现在我在做:
a_group.forEach(p => {
db.abc.update({
product_id: p._id,
year: 2021
}, {
$set: {
'abc.34': 'a'
}
}, {
upsert: true
});
});
其中a_group
只是一组产品。
对于大型产品数组来说,这真的很重。它只执行a_group.length
重新插入操作。
理想情况下,我想做这样的事情:
db.abc.update({
product_id: { $in: a_group.map(p => p._id) },
year: 2021
}, {
$set: {
'abc.34': 'a'
}
}, {
upsert: true,
multi: true
});
它将看到a_group是一个数组,并试图匹配并重新插入数组中的每个项。但那不管用。
任何帮助都将不胜感激。
发布于 2021-08-27 00:59:32
这里的问题是,您需要为_id的每个离散值单独插入。
从医生那里:
a向上插入:
没有匹配,则插入文档。
在插入时,如:
updateMany(
{a:{$in[1,2,3]}},
{$set:{b:true}},
{upsert: true}
)
如果存在包含a: 3
的文档,那么它将匹配查询筛选器,因此将更新一个文档,并且不会发生插入。
如果没有任何文档与传递给$in
的任何值匹配,则将对单个新文档进行向上插入。由于查询无法确定您想要的a
值,所以它将创建一个包含{b:true}
的文档,但不会对a
进行定义。
您可能需要的是一次对数据库的单次调用就可以执行许多重新插入操作的大容量操作。
使用mongosh shell,看起来可能如下所示:
let ops = [];
a_group.forEach(p => {
ops.push(
{ updateOne:
{
filter: {
product_id: p._id,
year: 2021
},
update: {$set: {'abc.34': 'a'}},
upsert: true
}
);
});
db.abc.bulkWrite(ops)
检查正在使用的驱动程序文档,看看如何进行大容量操作。
发布于 2021-08-26 16:09:18
根据您的代码,我认为a_group
是对象数组,因为您在forEach中使用了p._id,所以您应该从a_group
导出_id并推入新的数组,例如productsId
并替换
product_id: { $in: a_group }
使用
product_id: { $in: productsId },
https://stackoverflow.com/questions/68940629
复制相似问题