任何人都可以阐明它的含义吗?
db.getCollection("test_index").update({ "_id" : ObjectId("5c494913d5cddcf38e8b45dd")},
{
$inc : {'user.$.quantity_export' : {'$subtract' : ['$user.quantity_export','$user.quantity_remain']}},
$set : {'user.$.quantity_remain' : 5}
}
)
“ writeError”:{“代码”:14,“ errmsg”:“无法使用 非数字参数:{user。$。quantity_export:{$减:[ \“ $ user.quantity_export \”,\“ $ user.quantity_remain \”]}}“}
答案 0 :(得分:0)
由于无法在mongo的$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
运算符更新字段,有关更多详细信息,看看aggregation pipeline
为供您参考,此查询中的第一个查询会产生$subtract
错误,但将与汇总一起使用:
> db.test_index.aggregate([ {$match: {"_id" : ObjectId("5c6017b31765cd7b27eb473a")}}, {$project: {"abc" : {$subtract : ["$user.quantity_export","$user.quantity_remain"]} } } ])
{ "_id" : ObjectId("5c6017b31765cd7b27eb473a"), "abc" : -10000 }