좋아 내가
당신이 인덱스가 고유하고 있습니다 때문에 ... 그것을 가지고 - 값이 지금 같은 값을 공유 할 수 없습니다. 값은 [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 }
방금 시도해 본 결과 createIndex가 오류를 던졌습니다. 두 번째 줄에서 {unique : true}를 제거했을 때 실제로 업데이트가 완벽하게 작동했습니다. – dyouberg
@dyouberg : 왜 createIndex가 실패 했나요? 어떤 몽고 버전을 사용하고 있습니까? – Dreamcooled
몽고 버전 3.2.0 > db.foo.createIndex ({ "_pos": 1}, {독특한 : TRUE}) { \t "확인": 0, \t "에 errmsg": "E11000 키 오류를 중복 컬렉션 : test.foo 인덱스 : _pos_1 dup 키 : {: 1.0} ", \t"코드 ": 11000 } – dyouberg