MongoDb足够唯一的标识符-在MongoDb中使用$pop删除数组元素是否安全


MongoDb unique enough identifier - Is it safe to use $pop to remove elements of an array in mongo db?

我担心在mongodb中使用$pop来删除数组(嵌入文档)的元素,主要有两个原因:

  1. 我不知道数组的顺序是否是静态的。数组是否可以以不同的顺序返回/存储
  2. 若在我删除我的索引之前,另一个用户删除了一个小于或等于值的索引,该怎么办?这将导致删除错误的数据

我知道我可以使用$pull,但问题是我可能必须为criterea使用整个嵌入对象,我希望在处理嵌入对象时能够使用某种"uniqe enough"(这可能完全是另一个问题)标识符,并且它在数组中的位置似乎是合乎逻辑的选择。

如果使用$pop确实"不安全",我想了两种"足够唯一"的标识符的可能解决方案。

  1. 在插入时为每个嵌入对象添加一个新的MongoId实例。现在的问题是$set不插入重复条目的特性。在插入之前,您必须检查重复项
  2. json_encode新条目,然后md5散列该json字符串。这可能是最好的解决方案,因为它将确保标识符对该记录是唯一的,但如果您尝试插入相同的条目,它实际上仍然是相同的,因此$set将忽略它

所以我想我的问题分为两部分:从数组中删除项目时使用$pop安全吗。如果没有,为嵌入文档添加足够唯一的标识符的最佳做法是什么?

(这可能与我使用PHP无关)

对于1,如果以良好的方式操作数组,则数组的顺序不会改变。

对于2,您可以使用"更新当前"策略(乐观锁定):http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22UpdateifCurrent%22在文档中添加一个版本字段,每次修改时都会增加该字段(Doctrine MongoDB ODM可以为您做到这一点)。