복붙노트

[MONGODB] 어떻게 포함 된 배열의 갱신 후 새 값을 다시 얻으려면?

MONGODB

어떻게 포함 된 배열의 갱신 후 새 값을 다시 얻으려면?

다음 MongoDB의 수집을 감안할 때 :

{
    "_id": ObjectId("56d6a7292c06e85687f44541"),
    "name": "My ranking list",
    "rankings": [
        {
            "_id": ObjectId("46d6a7292c06e85687f55542"),
            "name": "Ranking 1",
            "score": 1
        },
        {
            "_id": ObjectId("46d6a7292c06e85687f55543"),
            "name": "Ranking 2",
            "score": 10
        },
        {
            "_id": ObjectId("46d6a7292c06e85687f55544"),
            "name": "Ranking 3",
            "score": 15
        },
    ]
}

저는 여기에 주어진 순위의 점수를 증가하는 방법이다 :

db.collection.update(
    { "_id": ObjectId("56d6a7292c06e85687f44541"), "rankings._id" : ObjectId("46d6a7292c06e85687f55543") },
    { $inc : { "rankings.$.score" : 1 } }
);

어떻게 새로운 점수 값을받을 수 있나요? 이전 쿼리에서 나는 내가 업데이트 후 새로운 값을 다시 얻는 방법을 ... 11-10에서 순위 두 번째를 증가?

해결법

  1. ==============================

    1.당신이 MongoDB를 3.0 이상에있는 경우, 당신은 반환에 필드의 하위 집합을 지정합니다 .findOneAndUpdate () 사용 프로젝션 옵션을 사용해야합니다. 또한 true로 설정 returnNewDocument해야합니다. 물론 당신은 당신의 위치 프로젝션을 사용하여 새 문서를 반환 할 수 없기 때문에 여기에 $ elemMatch 프로젝션 연산자를 사용합니다.

    당신이 MongoDB를 3.0 이상에있는 경우, 당신은 반환에 필드의 하위 집합을 지정합니다 .findOneAndUpdate () 사용 프로젝션 옵션을 사용해야합니다. 또한 true로 설정 returnNewDocument해야합니다. 물론 당신은 당신의 위치 프로젝션을 사용하여 새 문서를 반환 할 수 없기 때문에 여기에 $ elemMatch 프로젝션 연산자를 사용합니다.

    누군가가 지적 :

    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하고 새 값을 반환하기 위해 다른 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
                    }
            ]
    }
    
  2. from https://stackoverflow.com/questions/35946989/how-to-get-back-the-new-value-after-an-update-in-a-embedded-array by cc-by-sa and MIT license