2015-03-18 17 views
1

我正在運行使用Mongoose的更新問題,下面是模式定義。例如起見,下面我想通過輪胎500的數目乘以一個UDPATE汽車的價格:

car.js =

var mongoose = require('mongoose'); 
 

 
module.exports = mongoose.model('car', { 
 
    
 
    make  : {type:String}, 
 
    model : {type:String}, 
 
    num_tires: {type:Number, default:0} 
 
    price : {type:Number, default:0} 
 
    
 
}); 
 

updateCost.js =

var Car = require('car'); 
 

 
Car.update(
 
    {make: 'Honda'}, 
 
    {price: {$multiply: ['$num_tires', 500]}}, 
 
    {multi: true}, 
 
    function(err) { 
 
    console.log("Thar's an err", err); 
 
    });

我收到的錯誤是:「無法使用$乘以數字「。

是否有解決方案定義的方法更新價格的數量?謝謝大家的時間。

回答

3

您不能從update()中引用當前文檔的屬性。你要麼必須通過所有的文件遍歷和更新,或使用聚合與$multiply表達聚集運算中$project管道乘以num_tires場與常數:

db.cars.aggregate([ 
    { 
     $match: { 
      make: 'Honda' 
     } 
    }, 
    { 
      $project: { 
       make: 1, 
       model: 1, 
       num_tires: 1, 
       price: { 
        $multiply: [ "$num_tires", 500 ] 
       } 
     } 
    } 
]) 

或者你可以更新您的架構以包含任意字段unit_price: {type: Number, default: 500},然後您可以在$project管道中將其用作$multiply: [ "$num_tires", "$unit_price" ]

另一種方法是使用Save方法類似這樣通過所有匹配的文檔和更新迭代:

var Car = require('car'); 
Car.find({make: 'Honda'}).snapshot().forEach(
    function (e) { 
     // update document, using its own properties 
     e.price = e.num_tires * 500; 

     // remove old property 
     delete e.price; 

     // save the updated document 
     Car.save(e); 
    } 
); 

或者使用$set操作:

var Car = require('car'); 
Car.find().forEach(
    function (elem) { 
     Car.update(
      { 
       _id: elem._id, 
       make: "Honda" 
      }, 
      { 
       $set: { 
        price: elem.num_tires * 500 
       } 
      }, 
      {multi: true}, 
      function(err) { 
       console.log("There's an error ", err); 
      } 
     ); 
    } 
); 

如果你曾經爲默認值價格等於num_tires,那麼您可能只想更新price字段而不引用同一文檔中的其他字段,請使用$mul運營商:

var Car = require('car'); 
Car.update(
    {make: 'Honda'}, 
    {$mul: {price: 500}}, 
    {multi: true}, 
    function(err) { 
     console.log("There's an error ", err); 
    } 
}); 
+1

謝謝你的詳細答案,這是偉大的。我使用了上面提到的Car集合的迭代。我不熟悉.snapshop方法,這很酷。再次感謝! – 2015-03-20 13:58:23