不能将 $multiply 与 Number 一起使用

Can't use $multiply with Number

我 运行 使用 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);
  });

我收到的错误是:"Can't use $multiply with Number"。

有没有办法绕过模式定义数字来更新价格?感谢大家的宝贵时间。

您不能在 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" ]

另一种方法是遍历所有匹配的文档并使用这样的保存方法进行更新:

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