我有一个有10-15万条目的mongodb数据库。对于他们每个人,我必须更新最初不存在的字段。假设应用程序因意外的服务器关闭而崩溃,那么最好如何更新剩余的条目?
我应该使用field: {$exists: false}
并更新它们,还是应该遍历整个集合并检查每个文档是否有该字段,如果有,请执行更新?我认为这是因为你不能将一个索引与一个字段的存在联系起来,$ exists基本上是一样的。哪一个会更快,为什么?
请注意,该字段的值将依赖于文档的其他字段,因此我无法执行multi:true更新。
解决方案:作为@DhruvPathak和@Sammaye建议,而索引相关的数据,而不是自己的领域(所以你不能有一个索引链接到一个场的存在),$存在可以利用对存在这些字段的文档的索引,这大大提高了速度。
附加:虽然这是一个侧面的追求,我现在知道为什么应用程序崩溃的原因。服务器超时使用游标,因为它的使用时间太长(给定集合的大小)。这可以通过使用batch_size
来解决,如here所述。
[explain()](http://docs.mongodb.org/manual/reference/method/cursor.explain/)可能有帮助 – soulcheck 2014-08-28 13:26:00
您可以为文档添加“field_exists”字段,默认为false。如果你更新文件,你将“field_exists”设置为true。你可以轻松地在这个领域建立一个索引。 – thomas 2014-08-28 13:30:49
@soulcheck真的,解释将有助于$ exists查询,但在另一种情况下,我手动更新每个字段,解释不能给我关于循环更新每个文档的效率的数据。这是一个pymongo脚本。 – thehousedude 2014-08-28 13:31:56