更新mongoDB中的join。可能吗?

更新mongoDB中的join。可能吗?,mongodb,Mongodb,鉴于这三份文件: db.test.save({"_id":1, "foo":"bar1", "xKey": "xVal1"}); db.test.save({"_id":2, "foo":"bar2", "xKey": "xVal2"}); db.test.save({"_id":3, "foo":"bar3", "xKey": "xVal3"}); [{"_id":1, "foo":"bar1Upd"},{"_id":2, "foo":"bar2Upd"}] 以及引用这些文档的独立信息数组

鉴于这三份文件:

db.test.save({"_id":1, "foo":"bar1", "xKey": "xVal1"});
db.test.save({"_id":2, "foo":"bar2", "xKey": "xVal2"});
db.test.save({"_id":3, "foo":"bar3", "xKey": "xVal3"});
[{"_id":1, "foo":"bar1Upd"},{"_id":2, "foo":"bar2Upd"}]
以及引用这些文档的独立信息数组:

db.test.save({"_id":1, "foo":"bar1", "xKey": "xVal1"});
db.test.save({"_id":2, "foo":"bar2", "xKey": "xVal2"});
db.test.save({"_id":3, "foo":"bar3", "xKey": "xVal3"});
[{"_id":1, "foo":"bar1Upd"},{"_id":2, "foo":"bar2Upd"}]
是否可以在一次操作中更新两个参考文件(1和2)上的“foo”

我知道我可以在数组中循环并逐个执行,但我有数千个文档,这意味着到服务器的往返次数太多


非常感谢您的想法。

不可能在单个原子操作中更新两个参考文档(1和2)上的“foo”,因为MongoDB没有这样的机制。但是,看到您有一个大的集合,一个选项是利用,它允许您成批发送更新,而不是将每个更新请求发送到服务器

该过程涉及到在数组中循环所有匹配的文档,并处理批量更新,这将至少允许在单个请求中发送多个操作,并使用单个响应

这将为您提供更好的性能,因为您不会向服务器发送每个请求,而是每500个请求中发送一次,从而使您的更新更高效、更快

-编辑-


选择较低值的原因通常是受控选择。如文档中所述,MongoDB默认情况下将发送到,并且不能保证这些默认的1000个操作请求实际上符合。因此,您仍然需要站在“安全”的一边,施加一个较低的批处理大小,您只能有效地管理该批处理大小,以便在发送到服务器时,其总量小于数据限制


让我们用一个例子来演示上述方法:

a) 如果使用MongoDB v3.0或更低版本:

b) 如果使用MongoDB v3.2.X或更高版本(新的MongoDB版本3.2从API开始,并使用提供了一组更新的API):


_id 1和2的值不同。因此,我认为我们需要单独更新(即每个文档逐个文档)。如果所有文档的新值都相同,我们可以使用“multi:true”。谢谢您的回答。我注意到文档中说它最多可以处理1000个操作,如果超过这个数字,mongo将拆分操作本身,因此我想知道是否有特定的原因将批次拆分为500个大小?选择较低值的原因通常是可控的。如文档中所述,MongoDB默认情况下最多一次向服务器发送1000个操作,无法保证这些默认的1000个操作请求实际上符合16MB BSON限制。因此,您仍然需要站在“安全”的一边,施加一个较低的批处理大小,您只能有效地管理该批处理大小,以便在发送到服务器时,其总量小于数据限制。