MongoDb:$ inc具有唯一索引的多个文档

时间:2016-08-09 14:59:00

标签: mongodb

我有以下代码:

db.foo.insert([{_pos:1,b:12},{_pos:2,a:23},{_pos:3,c:12}])
db.foo.createIndex( { "_pos" : 1 }, { unique:  true } )
db.foo.update({}, { "$inc" : {"_pos" : 1} }, { multi : true })

最后一行给出了以下错误:

  

E11000重复键错误索引:JsonTableTemp.foo。$ _ pos_1 dup key:{   :2.0}

向查询添加$isolated无效。

如何在不先删除索引的情况下递增_pos字段?

我使用的是mongodb 3.2.6

1 个答案:

答案 0 :(得分:3)

好的,我明白了......

由于您使索引唯一 - 值不能共享相同的值。值为[1,2,3]。 increment是MongoDB的原子操作,所以它们一次出现一个......首先是[2,2,3]然后是[2,3,3],最后是[2,3,4]。

要证明这一点......只需将值反转为[3,2,1]即可开始。

> db.foo5.insert([{_pos:3,b:12},{_pos:2,a:23},{_pos:1,c:12}])
BulkWriteResult({
    "writeErrors" : [ ],
    "writeConcernErrors" : [ ],
    "nInserted" : 3,
    "nUpserted" : 0,
    "nMatched" : 0,
    "nModified" : 0,
    "nRemoved" : 0,
    "upserted" : [ ]
})
> db.foo5.createIndex( { "_pos" : 1 }, { unique:  true } )
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}
> db.foo5.find()
{ "_id" : ObjectId("57a9f76cb28f053d25a821a5"), "_pos" : 3, "b" : 12 }
{ "_id" : ObjectId("57a9f76cb28f053d25a821a6"), "_pos" : 2, "a" : 23 }
{ "_id" : ObjectId("57a9f76cb28f053d25a821a7"), "_pos" : 1, "c" : 12 }
> db.foo5.update({}, { "$inc" : {"_pos" : 1} }, { multi : true })
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
> db.foo5.find()
{ "_id" : ObjectId("57a9f76cb28f053d25a821a5"), "_pos" : 4, "b" : 12 }
{ "_id" : ObjectId("57a9f76cb28f053d25a821a6"), "_pos" : 3, "a" : 23 }
{ "_id" : ObjectId("57a9f76cb28f053d25a821a7"), "_pos" : 2, "c" : 12 }