基于在 mongodb 中更改 find/query 的批量更新

bulk update based on changing find/query in mongodb

在 MongoDB 中,我知道可以像这样进行批量更新:

bulk.find( { status: "D" } ).update( { $set: { status: "I", points: "0" } } );

这将匹配 "status" 为 "D" 的所有文档。

是否可以在 find 部分总是变化的情况下执行类似的操作?

换句话说,我可以一次完成所有这些吗?

bulk.find( { status: "A" } ).update( { $set: { status: "X", points: "1" } } );
bulk.find( { status: "B" } ).update( { $set: { status: "Y", points: "2" } } );
bulk.find( { status: "C" } ).update( { $set: { status: "Z", points: "3" } } );

是的,这当然是可能的,而且主要是 Bulk() 一般操作的要点。

您的列表中实际发生了什么:

bulk.find( { status: "A" } ).update( { $set: { status: "X", points: "1" } } );
bulk.find( { status: "B" } ).update( { $set: { status: "Y", points: "2" } } );
bulk.find( { status: "C" } ).update( { $set: { status: "Z", points: "3" } } );

这些操作实际上是"queued"或"batched"在一条尚未在服务器上执行的指令中。

只有当您实际调用该指令时,才会将操作发送到服务器并在服务器上执行:

bulk.execute()

响应将包含操作的结果以及可能的任何错误,具体取决于 initializeOrderedBulkOp() or initializeUnonderedBulkOp() 是否是被调用以初始化批量操作的操作。

请注意,一旦 .execute() 被调用,您需要在添加更多操作之前重新初始化并再次调用 .execute(),因为它会有效地 "drain" 操作队列。