Ok, ich habe es ...
Da Sie die Indizes einzigartig machen - die Werte immer nicht den gleichen Wert teilen. Die Werte sind [1,2,3]. Die increment ist eine atomare Operation von MongoDB, so dass sie nacheinander auftreten ... Zuerst wäre [2,2,3] dann [2,3,3] dann schließlich [2,3,4].
Um dies zu beweisen ... einfach die Werte auf [3,2,1] umkehren, um zu beginnen.
> 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 }
Ich habe es gerade versucht und der createIndex hat den Fehler für mich geworfen. Das Update funktionierte perfekt, als ich {unique: true} aus der zweiten Zeile entfernte. – dyouberg
@dyouberg: Warum scheiterte createIndex? Welche mongodb Version verwendest du? – Dreamcooled
Mongo Version 3.2.0 > db.foo.createIndex ({ "_pos": 1}, {einzigartig: true}) { \t "ok": 0, \t "errmsg": „E11000 Schlüsselfehler duplizieren Sammlung: test.foo Index: _pos_1 dup Schlüssel: {: 1.0} ", \t" Code ": 11000 } – dyouberg