问题描述
|
我担心使用$ pop删除mongodb中的数组元素(嵌入式文档)有两个主要原因:
我不知道数组的顺序是否是静态的。数组是否可能以其他顺序返回/存储?
如果另一个用户在删除我的我的数据库之前删除了一个小于或等于值的索引怎么办?这将导致错误的数据被删除。
我知道我可以使用$ pull,但是问题是我可能必须将整个嵌入对象用于criterea,我希望能够使用某种“足够的唯一”(这可能是另一个问题)处理嵌入对象时使用的标识符及其在数组中的位置似乎是合理的选择。
如果确实使用$ pop是“不安全的”,我想过一个“唯一足够”标识符的两种可能的解决方案。
插入时,将MongoId的新实例添加到每个嵌入式对象。现在的问题是失去了$ set \的不插入重复条目的功能。插入之前,您必须检查重复项。
json_encode新条目,然后md5哈希该json字符串。这可能是最好的解决方案,因为它将确保标识符对于该记录是唯一的,但是,如果您尝试插入相同的条目,则实际上仍然是相同的,因此$ set将忽略它。
所以我想我的问题有两个部分:从数组中删除项目时使用$ pop是否安全?如果不是,向嵌入式文档添加足够唯一的标识符的最佳实践是什么?
(我使用PHP可能相关,也可能无关)
解决方法
对于1,如果您以良好的方式进行操作,则数组的顺序不会改变。
对于2,您可以使用“如果当前更新”策略(乐观锁定):http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22UpdateifCurrent%22将版本字段添加到您的您将在每次修改时增加的文档(Doctorine MongoDB ODM可以为您完成此操作)。