|
Testing done against 2.5.5-pre (built off master)
git version: cec1b16a90acadf97b892a56fb15943a72f04398
// insert a few objects like this one
|
> db.foo.findOne()
|
{ "_id" : ObjectId("52d4b437ec0439c7ad81e069"), "a" : 4 }
|
|
// multi update with $mul works on all 4
|
> db.foo.update({}, {$mul : {a : 2}}, false, true)
|
SingleWriteResult({
|
"writeErrors" : [ ],
|
"writeConcernErrors" : [ ],
|
"nInserted" : 0,
|
"nUpserted" : 0,
|
"nUpdated" : 4,
|
"nModified" : 4,
|
"nRemoved" : 0,
|
"upserted" : [ ]
|
})
|
// now insert a string
|
> db.foo.insert({a : "x"})
|
SingleWriteResult({
|
"writeErrors" : [ ],
|
"writeConcernErrors" : [ ],
|
"nInserted" : 1,
|
"nUpserted" : 0,
|
"nUpdated" : 0,
|
"nModified" : 0,
|
"nRemoved" : 0,
|
"upserted" : [ ]
|
})
|
// retry the update, expecting an error
|
> db.foo.update({}, {$mul : {a : 2}}, false, true)
|
SingleWriteResult({
|
"writeErrors" : [
|
[object Object]
|
],
|
"writeConcernErrors" : [ ],
|
"nInserted" : 0,
|
"nUpserted" : 0,
|
"nUpdated" : 0,
|
"nModified" : 0,
|
"nRemoved" : 0,
|
"upserted" : [ ]
|
})
|
// checking the previous error gives us the actual error
|
> db.getPrevError()
|
{
|
"err" : "Cannot apply $mul to a value of non-numeric type. {_id: ObjectId('52d4b44eec0439c7ad81e06d')} has the field 'a' of non-numeric type String",
|
"code" : 16837,
|
"n" : 0,
|
"nPrev" : 2,
|
"ok" : 1
|
}
|
It's also worth noting that the nUpdated and nModified values are 0 when in fact the multiply operation was successful. Evidence:
> db.foo.find()
|
{ "_id" : ObjectId("52d4b437ec0439c7ad81e069"), "a" : 64 }
|
{ "_id" : ObjectId("52d4b43aec0439c7ad81e06a"), "a" : 48 }
|
{ "_id" : ObjectId("52d4b43cec0439c7ad81e06b"), "a" : 32 }
|
{ "_id" : ObjectId("52d4b43dec0439c7ad81e06c"), "a" : 16 }
|
{ "_id" : ObjectId("52d4b44eec0439c7ad81e06d"), "a" : "x" }
|
{ "_id" : ObjectId("52d4b63dec0439c7ad81e06e"), "a" : "y" }
|
> db.foo.update({}, {$mul : {a : 2}}, false, true)
|
SingleWriteResult({
|
"writeErrors" : [
|
[object Object]
|
],
|
"writeConcernErrors" : [ ],
|
"nInserted" : 0,
|
"nUpserted" : 0,
|
"nUpdated" : 0,
|
"nModified" : 0,
|
"nRemoved" : 0,
|
"upserted" : [ ]
|
})
|
// 0 modified or updated, but if we check the values again we can see the successful modification of the 4 numeric fields
|
> db.foo.find()
|
{ "_id" : ObjectId("52d4b437ec0439c7ad81e069"), "a" : 128 }
|
{ "_id" : ObjectId("52d4b43aec0439c7ad81e06a"), "a" : 96 }
|
{ "_id" : ObjectId("52d4b43cec0439c7ad81e06b"), "a" : 64 }
|
{ "_id" : ObjectId("52d4b43dec0439c7ad81e06c"), "a" : 32 }
|
{ "_id" : ObjectId("52d4b44eec0439c7ad81e06d"), "a" : "x" }
|
{ "_id" : ObjectId("52d4b63dec0439c7ad81e06e"), "a" : "y" }
|
|