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