2016-01-03 3 views
1

Я пытаюсь обновить поле со значением в евро, но что-то не так.Как обновить поле умножить значение поля Mongodb

db.orders.update({"_id" : ObjectId("56892f6065380a21019dc810")},{ 
$set:{ 
"wartoscEUR":{ 
$multiply: ["wartoscPLN",4] 
}}}) 

я получил ошибку:

WriteResult({ 
     "nMatched" : 0, 
     "nUpserted" : 0, 
     "nModified" : 0, 
     "writeError" : { 
       "code" : 52, 
       "errmsg" : "The dollar ($) prefixed field '$multiply' in 'wartoscEUR.$multiply' is not valid for storage." 

WartoscPLN и WartoscEUR являются числовые поля, и я хотел бы, чтобы вычислить wartoscEUR путем умножения wartoscPLN на 4.

К сожалению, может быть, это действительно легко, но я только начинаю в nosql.

+1

Похож контратипом http://stackoverflow.com/questions/3974985/update-mongodb-field-using-value-of-another -field. Короче говоря, вы не можете ссылаться на значение другого поля в обновлении. – JohnnyHK

ответ

0

$ multiply-operator используется только для агрегации. Оператор вы ищете $mul и имеет другой синтаксис:

db.orders.update(
    {"_id" : ObjectId("56892f6065380a21019dc810")}, 
    { $mul: { wartoscPLN: 4 } 
); 

Это не является необходимым, чтобы объединить его с $ набором, поскольку это означает, что семантический неявно.

+0

Но $ mul установил значение в wartoscPLN, и мне нужно установить в wartoscEUR – mauro

0

Оператор $multiply может использоваться только в структуре агрегации, а не в операции обновления. Вы можете использовать aggregation framework в вашем случае, чтобы создать новый результирующий набор с новым полем wartoscEUR, созданным с помощью трубопровода $project.

Из результирующего набора вы можете затем цикл через него (с помощью forEach() метод курсора возвращенного из метода .aggregate()), обновить свою коллекцию с новым значением, но вы не можете получить доступ к стоимости документа напрямую в операторе обновления, поэтому здесь может понадобиться операция обновления Bulk API:

Массовое обновление, по меньшей мере, позволит отправлять многие операции в одном запросе с сингулярным ответом.

выше операция может быть изображен с этой реализацией:

var bulk = db.orders.initializeOrderedBulkOp(), 
    counter = 0; 

db.orders.aggregate([ 
    { 
     "$project": {     
      "wartoscEUR": { "$multiply": ["$wartoscPLN", 4] } 
     } 
    } 
]).forEach(function (doc) { 
    bulk.find({ "_id": doc._id }).updateOne({ 
     "$set": { "wartoscEUR": doc.wartoscEUR } 
    }); 

    counter++; 

    if (counter % 1000 == 0) { 
     bulk.execute(); 
     bulk = db.orders.initializeOrderedBulkOp(); 
    } 
}); 

if (counter % 1000 != 0) { 
    bulk.execute(); 
} 
+0

Если вы все равно загружаете документы в свое приложение, вы можете просто использовать обычную 'find' вместо агрегации и делать умножение в javascript. .. или просто используйте [$ mul] (https://docs.mongodb.org/manual/reference/operator/update/mul/#up._S_mul) – Philipp

+0

chridam: Ok thx, я попробую, но я должен сказать Я думаю, что это будет легко, как в sql ... Philipp: я пытаюсь mul, но тогда я получил значение в поле wartoscPLN не в wartoscEUR, у меня нет доступа к приложению – mauro

Смежные вопросы