sql >> Databáze >  >> NoSQL >> MongoDB

Jak získat zpět novou hodnotu po aktualizaci ve vloženém poli?

Pokud používáte MongoDB 3.0 nebo novější, musíte použít .findOneAndUpdate() a použijte projection možnost určit podmnožinu polí, která se mají vrátit. Musíte také nastavit returnNewDocument true . Samozřejmě musíte použít $elemMatch promítací operátor zde, protože nemůžete použít poziční projekci a vrátit nový dokument.

Jak někdo poznamenal:

Měli byste používat .findOneAndUpdate() protože .findAndModify() je v každém oficiálním jazykovém ovladači označen jako zastaralý. Další věc je, že syntaxe a možnosti jsou docela konzistentní napříč ovladači pro .findOneAndUpdate() . Pomocí .findAndModify() , většina ovladačů nepoužívá stejný jediný objekt s klávesami „query/update/fields“. Je tedy o něco méně matoucí, když se někdo přihlásí do jiného jazyka, aby byl konzistentní. Standardizované změny API pro .findOneAndUpdate() ve skutečnosti odpovídají vydání serveru 3.x spíše než 3.2.x. Úplný rozdíl spočívá v tom, že metody shellu ve skutečnosti zaostávaly za ostatními ovladači (pro jednou!) při implementaci metody. Takže většina ovladačů ve skutečnosti zaznamenala velký nárůst vydání odpovídající vydání 3.x s takovými změnami.

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

Od MongoDB 3.0 výše musíte použít findAndModify a fields možnosti také musíte nastavit new true v jiném vrátíte novou hodnotu.

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

Oba dotazy vynesou:

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



  1. Zaručuje žurnálování MongoDB trvanlivost?

  2. Podmíněné seskupení s $existuje uvnitř $cond

  3. nastavit pole jako prázdné pro objekt mongo pomocí mongoose

  4. Propojení kontejneru Redis s jiným kontejnerem (Docker)