2016-01-03 99 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是一些领域,我想乘以wartoscPLN通过计算wartoscEUR 4

对不起,也许这是真的容易,但我只是开始在nosql。

+1

貌似http://stackoverflow.com/questions/3974985/update-mongodb-field-using-value-of-another的欺骗-领域。简而言之,您无法引用更新中另一个字段的值。 – JohnnyHK

回答

0

$ multiply-operator仅用于聚合。你正在寻找的运营商是$mul,它有一个不同的语法:

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

这是没有必要把它与$组结合的,因为它意味着,语义含蓄。

+0

但$ mul将值设置为wartoscPLN,然后我需要设置为wartoscEUR – mauro

0

$multiply操作员只能在聚合框架中使用,而不能在更新操作中使用。您可以在您的案例中使用aggregation framework创建一个新的结果集,该结果集包含使用管道创建的新字段wartoscEUR

从结果集然后你可以遍历它(使用从.aggregate()方法返回光标的forEach()法),更新您的收藏与新的价值,但你不能直接访问的文档的价值因此在更新声明中批量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:好的,我会试试,但我不得不说我的事情会很容易就像在sql ...菲利普:我尝试mul,但后来我在领域wartoscPLN的价值不在wartoscEUR,我没有进入应用程序 – mauro