更新时"不允许使用修饰符进行字段名称复制"

Shr*_*hna 21 mongodb

在尝试更新Mongo中的字段时,我得到"字段名称重复不允许使用修饰符"错误.一个例子:

> db.test.insert({test: "test1", array: [0]});
> var testFetch = db.test.findOne({test: "test1"});
> db.test.update(testFetch, 
                 {$push: {array: 1}, //push element to end of key "array"
                  $pop:  {array: -1} //pop element from the start of key "array"
                 });
  Field name duplication not allowed with modifiers
Run Code Online (Sandbox Code Playgroud)

有没有办法执行这个原子操作?我不想为此做两个单独的更新.

Gat*_* VP 13

Mongo的票务系统有一个突出的问题:http://jira.mongodb.org/browse/SERVER-1050

看起来好像是今年的.你的场景绝对是一个明智的场景,但它也与一堆边缘案例有关.如果你$push$pop一个空阵列怎么办?期待什么?如果你$push和你想要什么$pull

我不想为此做两个单独的更新.

我知道这样做真的有"代码味道",但它是否是使用此解决方案的完全阻止?"双重更新"会彻底摧毁服务器性能吗?

  • 我遇到了同样的错误.考虑到MongoDB的原子性,我认为这里的"双重更新"问题是一个严重的问题.如果你有多个应用程序可能会更新数组的同一部分,你实际上不希望$拉入一个操作然后$ push in another ...在两个之间某个其他进程可能已经改变了相同的数组元素,可能导致不良/意外行为. (2认同)
  • 我实际上在尝试解决并发问题时找到了解决方案.MongoDB的最新版本支持FindAndModify,并且与数组$ identifier(表示当前找到的数组元素)相结合,您可以在我认为是原子的单个操作中查找和更新文档的给定数组元素.至少,操作成功完成且没有错误,我们还没有遇到并发问题.;) (2认同)
  • 实际上,我相信可以直接用标准更新来更新**数组元素:`db.mycollection.update({myarray:{$ elemMatch:{someproperty:{$ in:{"a","b ","c"}}}}},{$ set:{'myarray.$.otherproperty':567}});`至于在一个数组上同时在一个数组上同时执行push/pop/pull原子语句(这实际上是原始问题所要求的),我实际上没有尝试过那个明确的任务(我不认为我第一次以同样的方式阅读问题.)我认为FindAndModify将是更好的方式,尽管... (2认同)