2011-01-03 5 views
10
Blog { 
    id:"001" 
    title:"This is a test blog", 
    content:"...." 
    comments:[{title:"comment1",content:".."},{title:"comment2",content:"..."}]  
} 

комментарии - внутренний список в блоге.Как обновить/вставить объект во внутренний список в Mongodb?

Но как я могу получить только comment1? и как я могу вставить/обновить новый комментарий в блоге? Если я получу полный блог и вставляю/обновляю содержимое в список комментариев, а затем сохраняю полный блог, как решать параллельный isuue?

Спасибо.

ответ

5

Чтобы получить внедренный документ, вам необходимо получить основной документ и выполнить поиск по его комментариям вложенного документа документа, который вы хотите. На самом деле в MongoDB нет лучшего способа сделать это.

Чтобы вставить/обновить во встроенном документе, вы можете использовать систему запросов для этого.

+0

Спасибо, но я хочу получить только комментарий1, и мне нужно получить все комментарии? Это может привести к производительности, если количество комментариев велико. –

+0

вы правы, поэтому это нехороший дизайн для использования встроенного документа с некоторыми документ будет расти во времени. Вам нужно подождать виртуальную коллекцию, чтобы сделать это в futur – shingara

21
Blog { 
    id:"001" 
    title:"This is a test blog", 
    content:"...." 
    comments:[{title:"comment1",content:".."},{title:"comment2",content:"..."}]  
} 

Чтобы вставить комментарий, используйте $push:

db.blogs.update({id:"001"}, {$push:{comments:{title:"commentX",content:".."}}}); 

Чтобы обновить комментарий, используйте $set:

db.blogs.update({id:"001"}, {$set :{"comments.2": {...} }}); 
db.blogs.update({id:"001"}, {$set :{"comments.2.title": "new title" }}); 

2 является индекс данного комментария. Необходимо использовать знак кавычки.

+1

Более практичный ответ - должен быть отмечен как принятый –

+0

У меня есть сомнение в том, что это решение, если два разных потока, вызовите db.blogs.update в одно и то же время (состояние гонки). Предоставляет ли mongo 2 элемента списка, сохраненные в документе? – landrady

1

Для уточнения конкретного комментария по заголовку.

db.blogs.update({'comments.title': 'comment1'}, {$set :{"comments.$.title": "new title" }}); 

Вы также можете обновить содержание комментария с его названием.

db.blogs.update({'comments.title': 'comment1'}, 
{$set :{"comments.$.title": "new title", 'comments.$.content': 'this is content' }}); 

Если возникнут проблемы, ответьте мне.

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