更新するドキュメントの値を参照することはできないため、ドキュメントを取得するためのクエリと、ドキュメントを更新するためのクエリが必要になります。 機能リクエスト
があるようです そのためにOPEN
2016年以降の州。
次のようなドキュメントを含むコレクションがある場合:
{ "_id" : ObjectId("590a4aa8ff1809c94801ecd0"), "name" : "bar" }
MongoDBシェルを使用すると、次のようなことができます。
db.test.find({ name: "bar" }).snapshot().forEach((doc) => {
doc.name = "foo-" + doc.name;
db.test.save(doc);
});
ドキュメントは期待どおりに更新されます:
{ "_id" : ObjectId("590a4aa8ff1809c94801ecd0"), "name": "foo-bar" }
.snapshot()
に注意してください
呼び出し。これにより、ドキュメントサイズの増加により、書き込み操作の間にドキュメントが移動するため、クエリがドキュメントを複数回返さないことが保証されます。
この公式の例 で説明されているように、これをマングースの例に適用します。 :
Cat.findById(1, (err, cat) => {
if (err) return handleError(err);
cat.name = cat.name + "bar";
cat.save((err, updatedCat) => {
if (err) return handleError(err);
...
});
});
$concat
があることは言及する価値があります
集計フレームワークの演算子ですが、残念ながらupdate
では使用できません。 クエリ。
とにかく、あなたがする必要があることに応じて、あなたはそれを $out
集計結果を新しいコレクションに保存する演算子。
同じ例で、次のことを行います。
db.test.aggregate([{
$match: { name: "bar" }
}, {
$project: { name: { $concat: ["foo", "-", "$name"] }}
}, {
$out: "prefixedTest"
}]);
そして、新しいコレクションprefixedTest
次のようなドキュメントで作成されます:
{ "_id" : ObjectId("XXX"), "name": "foo-bar" }
参考までに、この同じトピックに関する別の興味深い質問があり、読む価値のあるいくつかの回答があります。別のフィールドの値を使用してMongoDBフィールドを更新する