如何在mongodb中使用$减去$ inc的文档

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在mongodb中使用$减去$ inc的文档相关的知识,希望对你有一定的参考价值。

有人能说清楚这指的是什么吗?

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”:{“code”:14,“errmsg”:“不能使用非数字参数递增:{user。$。quantity_export:{$ subtract:[”$ user.quantity_export “,”$ user。 quantity_remain “]}}”}

答案

你得到错误,因为你不能在$subtract或mazo的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的官方文档

为了您的信息,此ans中的第一个查询与$subtract产生错误,但将与聚合一起使用:

> db.test_index.aggregate([ {$match: {"_id" : ObjectId("5c6017b31765cd7b27eb473a")}}, {$project: {"abc" : {$subtract : ["$user.quantity_export","$user.quantity_remain"]} } } ])
{ "_id" : ObjectId("5c6017b31765cd7b27eb473a"), "abc" : -10000 }

以上是关于如何在mongodb中使用$减去$ inc的文档的主要内容,如果未能解决你的问题,请参考以下文章

《MongoDB入门教程》第15篇 文档更新之$inc操作符

《MongoDB入门教程》第15篇 文档更新之$inc操作符

mongodb_修改器($inc/$set/$unset/$push/$pop/upsert......)

mongodb_修改器($inc/$set/$unset/$push/$pop/upsert......)

如何使用聚合管道从 mongodb 中的当前字段中减去更新?

mongodb_修改器($inc/$set/$unset/$push/$pop/upsert......)