Bạn không thể tham chiếu các thuộc tính của tài liệu hiện tại từ bên trong bản cập nhật (). Bạn sẽ phải lặp lại tất cả các tài liệu và cập nhật chúng hoặc sử dụng tổng hợp với $multiply
biểu thức dưới dạng một phép toán số học tổng hợp trong $project
đường ống để nhân num_tires
trường với hằng số:
db.cars.aggregate([
{
$match: {
make: 'Honda'
}
},
{
$project: {
make: 1,
model: 1,
num_tires: 1,
price: {
$multiply: [ "$num_tires", 500 ]
}
}
}
])
Hoặc bạn có thể cập nhật giản đồ của mình để bao gồm một trường tùy ý unit_price: {type: Number, default: 500}
sau đó bạn có thể sử dụng làm $multiply: [ "$num_tires", "$unit_price" ]
trong $project
đường ống dẫn.
Một giải pháp thay thế khác là lặp lại tất cả các tài liệu phù hợp và cập nhật bằng cách sử dụng phương pháp lưu như sau:
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);
}
);
Hoặc sử dụng $set
nhà điều hành:
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);
}
);
}
);
Nếu bạn có giá trị mặc định cho giá bằng num_tires
, thì bạn có thể chỉ cần cập nhật price
trường mà không tham chiếu đến trường khác trong cùng một tài liệu, hãy sử dụng $mul
nhà điều hành:
var Car = require('car');
Car.update(
{make: 'Honda'},
{$mul: {price: 500}},
{multi: true},
function(err) {
console.log("There's an error ", err);
}
});