Вы получаете сообщение об ошибке, потому что вы не можете использовать $subtract
в update
или find
методе монго, его следует использовать только в Aggregation
, поэтому изучите приведенный ниже запрос, используя subtract
db.test_index.find({"_id" : ObjectId("5c6017b31765cd7b27eb473a")}, {"abc" : {$subtract : ["$user.quantity_export","$user.quantity_remain"]} } )
Это приведет к ошибке следующего типа:
Error: error: {
"ok" : 0,
"errmsg" : "Unsupported projection option: abc: { $subtract: [ \"$user.quantity_export\", \"$user.quantity_remain\" ] }",
"code" : 2,
"codeName" : "BadValue"
}
И это значение будет помещено в ваш $inc
для поля 'user.$.quantity_export'
т.е. $inc : {'user.$.quantity_export' : {'$subtract' : ['$user.quantity_export','$user.quantity_remain']}}
, это вызываетошибка.Вы можете просто проверить ниже запрос с ошибкой, которую вы получаете:
> db.test_index.update({"_id" : ObjectId("5c6017b31765cd7b27eb473a")}, {$inc : {"user.quantity_export" : {"Bad values" : "abc"} }} )
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 14,
"errmsg" : "Cannot increment with non-numeric argument: {user.quantity_export: { Bad values: \"abc\" }}"
}
})
>
Теперь решение вашей проблемы:
Так как $subtract
используются вAggregation
, поэтому вы должны использовать агрегацию и обновлять поля с помощью оператора $out
на последнем этапе агрегации, для более подробной информации вы можете взглянуть на официальную документацию конвейер агрегации
К вашему сведению, первый запрос в этом ответе выдаст ошибку с $subtract
, но будет работать с агрегацией как :
> db.test_index.aggregate([ {$match: {"_id" : ObjectId("5c6017b31765cd7b27eb473a")}}, {$project: {"abc" : {$subtract : ["$user.quantity_export","$user.quantity_remain"]} } } ])
{ "_id" : ObjectId("5c6017b31765cd7b27eb473a"), "abc" : -10000 }