2016-03-23 4 views
2

ниже моя коллекция:обновления последней строки с критериями поиска в MongoDB

db.himtest.find({name:"himanshu"}) 
{ "_id" : ObjectId("56f1667611c54cf649076577"), "name" : "himanshu", "age" : 45, 
"points" : 10 } 
    { "_id" : ObjectId("56f1667c11c54cf649076578"), "name" : "himanshu", "age" : 35, 
"points" : 10 } 
{ "_id" : ObjectId("56f1669511c54cf64907657b"), "name" : "himanshu", "age" : 35, 
"points" : 1100 } 
{ "_id" : ObjectId("56f1669a11c54cf64907657c"), "name" : "himanshu", "age" : 35, 
"points" : 11000 } 
{ "_id" : ObjectId("56f1669d11c54cf64907657d"), "name" : "himanshu", "age" : 45, 
    "points" : 11000 } 
{ "_id" : ObjectId("56f166a311c54cf64907657e"), "name" : "himanshu", "age" : 45, 
    "points" : 1200 } 

Теперь я хочу, чтобы обновить последнюю строку на основе какого-либо критерии выбора что-то вроде:

db.himtest.find({name:"himanshu",age:45}).sort({_id:-1}).limit(1).update({points:100}); 

ответ

1

Вы можете сделать это с помощью findAndModify, который позволяет включать в спецификацию сортировки, чтобы определить, какие из соответствующих документов для обновления:

db.himtest.findAndModify({ 
    query: {name: "himanshu", age: 45}, 
    sort: {_id: -1}, 
    update: {$set: {points: 100}}, 
    new: true 
}) 

Если вы используете v3.2 или выше, вы можете также использовать findOneAndUpdate:

db.himtest.findOneAndUpdate(
    {name: "himanshu", age: 45}, 
    {$set: {points: 100}}, 
    { 
     sort: {_id: -1}, 
     returnNewDocument: true 
    }) 
+0

Возможно, следует использовать ['.findOneAndUpdate()'] (https://docs.mongodb.org/manual/reference/method/db.collection.findOneAndUpdate/), учитывая, что, хотя документация «shell» еще не отмечена как устаревший, все другие документы API. Это также совместимо с языковыми API. Удивленный этот вопрос не задавался раньше. –

+0

@BlakesSeven Да, но было непонятно, был ли OP в 3.2, поэтому я пошел с опцией наименьшего общего знаменателя. Во всяком случае, хорошая идея - добавлено. – JohnnyHK

0

Вы хотел бы сделать что-то подобное.

db.himtest.find({name:"himanshu",age:45}). 
    sort({id:-1}). 
    limit(1). 
    forEach(function(e){ 
    e.points = 100 
    db.himtest.save(e) 
}) 

Не уверен, что вы используете что-то вроде мангуста или оболочки монгодба. Если вы укажете, что я могу проверить, чтобы убедиться, что ответ будет работать.

+0

я использую MongoDB оболочки –

+0

см обновленный ответ. Дайте мне знать, как это работает для вас. – user2263572

+0

FYI, только что обновленный, я оставил строку. – user2263572

Смежные вопросы