как использовать $ вычитать с $ inc документа в mongodb - PullRequest
0 голосов
/ 10 февраля 2019

Может кто-нибудь пролить свет на то, к чему это относится?

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. $. amount_export: {$ subtract: [\ "$ user.quantity_export \", \ "$ user.quantity_remain \"]}} "}

1 Ответ

0 голосов
/ 10 февраля 2019

Вы получаете сообщение об ошибке, потому что вы не можете использовать $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 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...