Несколько атомарных обновлений с использованием MongoDB? - PullRequest
2 голосов
/ 19 октября 2011

Я использую Codeigniter и библиотеку Алекса Билби MongoDB. В моем API, который я разрабатываю, пользователи могут загружать изображения, а другие пользователи могут комментировать их. Я решил включить комментарии как вспомогательные документы к изображениям.

Каждый комментарий содержит:

  • ФИО (автора)
  • Комментарий
  • created_at

Так, другими словами. Полное имя пользователя «жестко закодировано» в каждом комментарии, так что если они позже решу сменить фамилию у меня проблема.

Я прочитал, что могу использовать атомарные обновления для обновления всех вхождений имени (как в комментариях), но как я могу сделать это, используя библиотеку Алекса? Могу ли я обновить все места, где имя неверно?

UPDATE

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

{
    "_id": ObjectId("4e9ead773dc793dc01020000"),
    "description": "An image",
    "category": "accident",
    "comments": [
        {
            "id": ObjectId("4e96bd063dc7937202000000"),
            "fullname": "James Bond",
            "comment": "This is a comment.",
            "created_at": "2011-10-19 13:02:40"
        }
    ],
    "created_at": "2011-10-19 12:59:03"
}

Благодарю за помощь!

1 Ответ

1 голос
/ 19 октября 2011

Я не знаком с codeignitor, но синтаксис оболочки mb mongodb поможет вам:

db.comments.update( {"Fullname":"Andrew Orsich"}, 
                    { $set : { Fullname: "New name"} }, false, true )

Последний флаг true указывает, что вы хотите обновить несколько документов. Таким образом, можно обновить все комментарии за одну операцию обновления.

Кстати: денормализация (не «жесткое кодирование») данных в mongodb и nosql в целом является обычной операцией Также операции, требующие обновления большого количества документов, обычно работают асинхронно. Но это зависит от вас.

Обновление:

db.comments.update( {"comments.Fullname":"Andrew Orsich"}, 
                    { $set : { comments.$.Fullname: "New name"} }, false, true )

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

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