2016-01-03 53 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