2013-12-18 4 views
1

Я неплохо разбираюсь в SQL, но я боюсь даже самых простых запросов Mongo.Как обновить объекты в массиве в Mongo

Мои документы в post коллекции выглядит следующим образом (упрощенный)

{ 
    '_id': 5 
    'body': 'Correct horse battery staple', 
    'comments': 
    [{ 
      user_id: '123' 
     }, 
     { 
      user_id: '456' 
     }, 
     { 
      user_id: '123' 
     }] 
} 

мне нужно обновить user_id's, которые являются '123' к 'abc' для всех сообщений.

В базе данных SQL, я бы post стол и comment стол и сделать это:

UPDATE comment SET user_id = 'abc' WHERE user_id = '123' 
+0

возможно дубликат [Как обновить несколько элементов массива в MongoDB] (http://stackoverflow.com/questions/4669178/how-to-update-multiple-array-elements-in-mongodb) – JohnnyHK

ответ

1

Я думаю, что вы ищете FindAndModify:

db.runCommand({ 
    findAndModify: "post", 
    query: { user_id: 123 }, 
    update: { $set: { user_id: 'abc' } } 
}) 

Редактировать

Я считаю, что вы можете сделать подобное в коллекции с update, если multi установлен в true:

db.post.update(
    { user_id: 123 }, 
    { $set: { user_id: 'abc' } }, 
    { multi: true } 
) 
+0

мне нужно изменить * все * документы, а не только один. Я уточнил свой вопрос, чтобы быть более явным. –

1

По умолчанию, команда обновления MongoDB будет обновлять только один документ.

db.collection.update({document to be found},{changes to be done}) 

Чтобы обновить несколько документов, вы должны включать в себя мульти ключевого слова.

db.collection.update({document to be found},{changes to be done},{multi:true}) 

Если предположить, что структура документа, как показано ниже:

{ 
    "_id": 5, 
    "body": "Correct horse battery staple", 
    "comments": [{"user_id": "123"},{"user_id": "456"},{"user_id": "123"}] 
} 
{ 
    "_id": 6, 
    "body": "Correct horse battery staple", 
    "comments": [{"user_id': "23"},{"user_id": "123"},{"user_id": "13"}] 
} 

В этом случае, я, возможно, потребуется обновить несколько элементов внутри массива, а также несколько документов. Для этого не требуется запрос mongodb по умолчанию. Вместо этого я прокручу документы и сделаю это следующим образом.

// loop until all documents has been updated 
while(db.post.find({'comments.user_id':'123'}).count()!=0) 
{ 
    db.post.update(
        { 'comments.user_id':'123' }, 
        { $set:{'comments.$.user_id':'abc'} }, 
        { multi:true } 
        ) 
} 

После запуска 1-го контура, коллекция пост будет выглядеть следующим образом:

{ 
    "_id": 5, 
    "body": "Correct horse battery staple", 
    "comments": [{"user_id": "abc"},{"user_id": "456"},{"user_id": "123"}] 
} 
{ 
    "_id": 6, 
    "body": "Correct horse battery staple", 
    "comments": [{"user_id": "23"},{"user_id": "abc"},{"user_id": "13"}] 
} 

После запуска 2-го контура, коллекция пост будет выглядеть следующим образом:

{ 
    "_id": 5, 
    "body": "Correct horse battery staple", 
    "comments": [{"user_id": "abc"},{"user_id": "456"},{"user_id": "abc"}] 
} 
{ 
    "_id": 6, 
    "body": "Correct horse battery staple", 
    "comments": [{"user_id": "23"},{"user_id": "abc"},{"user_id": "13"}] 
} 

В третьем запуске цикла цикл завершается.

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