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}
これを$multiply: [ "$num_tires", "$unit_price" ]
として使用できます。 $project
で パイプライン。
もう1つの方法は、一致したすべてのドキュメントを反復処理し、次のような保存方法を使用して更新することです。
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);
}
});