有没有办法从mongodb';s使用猫鼬进行批量操作? let dbOperations=Edge.collection.initializeOrderedBulkOp() forEach(edge=>{ dbOperations.find({u id:edge.id}).upsert().updateOne({ $set:{ 值:edge.value }, $setOnInsert:{ _id:edge.id } }) }) dbOperations.execute() 。然后(结果=>{ console.log(result.nModified)//这显示实际修改的边数 console.log(result.getModifiedIds())//这就是我想要实现的目标 })

有没有办法从mongodb';s使用猫鼬进行批量操作? let dbOperations=Edge.collection.initializeOrderedBulkOp() forEach(edge=>{ dbOperations.find({u id:edge.id}).upsert().updateOne({ $set:{ 值:edge.value }, $setOnInsert:{ _id:edge.id } }) }) dbOperations.execute() 。然后(结果=>{ console.log(result.nModified)//这显示实际修改的边数 console.log(result.getModifiedIds())//这就是我想要实现的目标 }),mongodb,mongoose,mongodb-query,Mongodb,Mongoose,Mongodb Query,有没有办法做到这一点?从一个角度来看,答案是“不”,这是有很好的理由的 一般来说,MongoDB“更新”操作旨在跨通常的“多个”文档工作,因此意味着任何符合标准的文档。因此,这里的一般情况是,您要求以单数或选择方式更新的内容是否更新取决于是否匹配 在“批量”上下文中,同样的情况也适用,即存在或不存在条件匹配,在这种情况下,您将分别获得nMatched和nModified的返回值,因为也可能存在“匹配”如果要修改的数据已经是修改的目标值,则不会实际更新文档 nMatched和nModified之间

有没有办法做到这一点?

从一个角度来看,答案是“不”,这是有很好的理由的

一般来说,MongoDB“更新”操作旨在跨通常的“多个”文档工作,因此意味着任何符合标准的文档。因此,这里的一般情况是,您要求以单数或选择方式更新的内容是否更新取决于是否匹配

在“批量”上下文中,同样的情况也适用,即存在或不存在条件匹配,在这种情况下,您将分别获得
nMatched
nModified
的返回值,因为也可能存在“匹配”如果要修改的数据已经是修改的目标值,则不会实际更新文档

nMatched
nModified
之间的最后一个区别是“您无法可靠地执行此操作”的主要原因,因为并非所有匹配的内容都需要修改

但是,在区分“upsert”操作和实际“updates”的情况下,您可以创建一个guestimate值。由于注意到的差异,它不会100%准确,但基本过程是将输入列表与来自
getupserteds()
的返回值进行比较,这是一个有效的调用

目前,世界其他地区都在回避ES6语法:

var upserted=result.getupserteds();//从批量结果中获取此信息
upserted=upserted.map(函数(up){return up._id});//仅过滤掉_id值
var modifiedIds=edges.map(函数(edge){//get\u id仅来自源
返回edge.id;
}).过滤器(功能(边缘){
返回upserted.indexOf(edge)=-1;//并仅返回非upserted
});
其中,from
.getupserteds()
的返回结果是一个对象数组,其中包含批量更新的“索引”位置和生成或提供的“upsert”的
\u id

[{index:0,\u id:1}]
因此,将您的输入列表与“upserted”列表进行匹配,以查看“不存在的内容”,基本上返回可能刚刚修改过的内容。当然要注意的是,如果该值已经与修改相同,那么它实际上根本就不是一个修改


但是,由于API的工作原理,这是您将要得到的最接近的结果。

感谢您提供的扩展答案。我想没有办法知道(无论如何都是批量)哪些文档确实被修改了,只是有些文档被修改了。@Martol1ni这是
nModified
的一般警告(实际上只有在更新的批量操作API下才会正确报告,因为即使相同的值,遗留API也会报告修改)除非您一次只查看一个更新(和一个文档),否则与
nMatched
相比,它实际上不是受影响文档数量的指标。因此,如果有什么事情发生,那么这个数字应该是“超过”报告的,而不是“低于”@BlakesSeven,我看你的例子是针对upsert的。你能想出一个替代方法来返回批量查找()的ID。更新()?你有没有从响应中获取修改过的ID的选项?