MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да върна новата стойност след актуализация във вграден масив?

Ако използвате MongoDB 3.0 или по-нова, трябва да използвате .findOneAndUpdate() и използвайте projection опция за задаване на подмножество от полета, които да се върнат. Трябва също да зададете returnNewDocument до true . Разбира се, трябва да използвате $elemMatch проекционен оператор тук, защото не можете да използвате позиционна проекция и да върнете новия документ.

Както някой посочи:

Трябва да използвате .findOneAndUpdate() защото .findAndModify() е маркиран като отхвърлен във всеки драйвер за официален език. Другото нещо е, че синтаксисът и опциите са доста последователни в драйверите за .findOneAndUpdate() . С .findAndModify() , повечето драйвери не използват един и същ обект с клавиши "заявка/актуализация/полета". Така че е малко по-малко объркващо, когато някой кандидатства за друг език, за да бъде последователен. Стандартизирани промени в API за .findOneAndUpdate() всъщност отговарят на версия на сървъра 3.x, а не на 3.2.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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Автоматично остарявайте документите за колекция MongoDB

  2. Най-бързият начин за премахване на дублиращи се документи в mongodb

  3. Възможно ли е да се прехвърля в MongoDB-Query?

  4. 10 съвета за подобряване на сигурността на MongoDB

  5. как да извика операция за броене след намиране с mongodb java драйвер