不能使用$乘以Number

时间:2015-03-18 20:52:30

标签: mongodb mongoose

我遇到使用Mongoose的更新问题,下面是架构定义。例如,下面我想通过将轮胎数量乘以500来改变汽车的价格:

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);
  });




我收到的错误是:"不能使用$乘以Number"。

架构定义数量是否有办法更新价格?谢谢大家的时间。

1 个答案:

答案 0 :(得分:3)

您无法在update()中引用当前文档的属性。您要么必须遍历所有文档并更新它们,要么使用$multiply表达式聚合作为 $project 管道中聚合的算术运算,以乘以{{ 1}}具有常量的字段:

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}管道中将其用作$multiply: [ "$num_tires", "$unit_price" ]

另一种方法是遍历所有匹配的文档并使用save方法进行更新,如下所示:

$project

或使用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字段而不引用同一文档中的其他字段,请使用 $mul 运营商:

price