我遇到使用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"。
架构定义数量是否有办法更新价格?谢谢大家的时间。
答案 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