sql >> データベース >  >> NoSQL >> MongoDB

MongoDB/Mongooseの以前の値を使用してフィールドを更新する方法

    更新するドキュメントの値を参照することはできないため、ドキュメントを取得するためのクエリと、ドキュメントを更新するためのクエリが必要になります。 機能リクエスト があるようです そのために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フィールドを更新する



    1. Node +Mongodb+ネストされた配列の並べ替え

    2. $exprを使用した$nin

    3. PyMongo upsertthrowsupsertはboolエラーのインスタンスである必要があります

    4. 解析サーバーのインストールで「MongoErrorwriteEPIPE」