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

埋め込み配列の更新後に新しい値を取り戻すにはどうすればよいですか?

    MongoDB 3.0以降を使用している場合は、.findOneAndUpdate()を使用する必要があります projectionを使用します 返すフィールドのサブセットを指定するオプション。 returnNewDocumentも設定する必要があります trueに 。もちろん、$elemMatchを使用する必要があります 位置射影を使用して新しいドキュメントを返すことはできないため、ここでは射影演算子を使用します。

    誰かが指摘したように:

    .findOneAndUpdate()を使用する必要があります .findAndModify()のため すべての公用語ドライバーで非推奨としてハイライトされています。もう1つは、構文とオプションが.findOneAndUpdate()のドライバー間でかなり一貫していることです。 。 .findAndModify()を使用 、ほとんどのドライバは、「query / update/fields」キーで同じ単一のオブジェクトを使用しません。したがって、誰かが一貫性を保つために別の言語に適用する場合は、少し混乱が少なくなります。 .findOneAndUpdate()の標準化されたAPIの変更 実際には、3.2.xではなくサーバーリリース3.xに対応しています。完全な違いは、シェルメソッドが実際に他のドライバーよりも遅れていることです(一度だけ!)。そのため、ほとんどのドライバーには、実際には、そのような変更を加えた3.xリリースに対応するメジャーリリースバンプがありました。

    db.collection.findOneAndUpdate( 
        { 
            "_id": ObjectId("56d6a7292c06e85687f44541"), 
             "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
        },  
        { $inc : { "rankings.$.score" : 1 } },  
        { 
            "projection": { 
                "rankings": { 
                    "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") } 
                }
            }, 
            "returnNewDocument": true 
        }
    )
    

    MongoDB 3.0以降では、findAndModifyを使用する必要があります およびfields オプションもnewを設定する必要があります trueに 他の場合は、新しい値を返します。

    db.collection.findAndModify({   
        query: { 
            "_id": ObjectId("56d6a7292c06e85687f44541"), 
            "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
        },     
        update: { $inc : { "rankings.$.score" : 1 } },       
        new: true,  
        fields: { 
            "rankings": { 
                "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
            }  
        }
    })
    

    どちらのクエリでも次の結果が得られます:

    {
            "_id" : ObjectId("56d6a7292c06e85687f44541"),
            "rankings" : [
                    {
                            "_id" : ObjectId("46d6a7292c06e85687f55543"),
                            "name" : "Ranking 2",
                            "score" : 11
                    }
            ]
    }
    



    1. MongoDBシャードクラスターを作成するための3つの簡単なステップ

    2. Mongodbを3.2から3.6にアップグレード中にエラーが発生しました

    3. モンゴトリプルコンパウンドインデックス

    4. Redis SortedSetがバランスツリーの代わりにスキップリストを使用するのはなぜですか?