MongoDB: Обновление поддокумента - PullRequest
43 голосов
/ 13 апреля 2011

У меня есть эта коллекция:

[{ "_id" : 7,
   "category" : "Festival",
   "comments" : [
        {
                "_id" : ObjectId("4da4e7d1590295d4eb81c0c7"),
                "usr" : "Mila",
                "txt" : "This is a comment",
                "date" : "4/12/11"
        }
    ]
}]

Все, что я хочу, это нажать вставить новое поле внутри комментариев, как это:

[{ "_id" : 7,
   "category" : "Festival",
   "comments" : [
        {
                "_id" : ObjectId("4da4e7d1590295d4eb81c0c7"),
                "usr" : "Mila",
                "txt" : "This is a comment",
                "date" : "4/12/11",
                "type": "abc"  // find the parent doc with id=7 & insert this inside comments
        }
    ]
}]

Как я могу вставить в под-документ комментарии?

Ответы [ 2 ]

78 голосов
/ 13 апреля 2011

Вам нужно использовать позиционный оператор $

Например:

update({ 
       _id: 7, 
       "comments._id": ObjectId("4da4e7d1590295d4eb81c0c7")
   },{
       $set: {"comments.$.type": abc}
   }, false, true
);

Я не тестировал его, но надеюсь, что он будет полезен дляyou.

Если вы хотите изменить структуру документа, вам нужно использовать

db.collection.update (критерии, objNew, upsert, multi)

Аргументы:

criteria - query which selects the record to update;
objNew - updated object or $ operators (e.g., $inc) which manipulate the object
upsert - if this should be an "upsert"; that is, if the record does not exist, nsert it
multi - if all documents matching criteria should be updated

и вставьте новый объект с новой структурой. проверьте это для более подробной информации

3 голосов
/ 03 января 2014

Оператор $ positional будет работать как положено, только если поле 'comments' НЕ является массивом.Json в OP искажен, но похоже, что это может быть массив.

Проблема в том, что mongodb прямо сейчас обновит только первый элемент массива, который соответствует запросу.Хотя есть RFE, в котором можно добавить поддержку для обновления всех соответствующих элементов массива: https://jira.mongodb.org/browse/SERVER-1243

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...