как безопасно обновить порядковый номер в mongodb - PullRequest
0 голосов
/ 05 марта 2012

В моей базе данных mongodb есть коллекция 'messages', в ней есть поле 'order' со значениями целых чисел

msg1.order=1, msg2.order=2, msg3.order=3, msg4.order=4, msg5.order=5, ... 

для каждого сообщения, представляет упорядоченную последовательность подколлекций сообщений.

в то время как эти сообщения могут быть повторно отсортированы через веб-страницу с использованием jquery.sortable. например, если я переместлю сообщение с позиции № 3 на № 1, то я должен изменить значения «порядка» на

msg1.order=2, msg2.order=3, msg3.order=1, msg4.order=4, msg5.order=5, ...

. Существуют ли какие-либо модификаторы mongodb или другие средства для выполнения такого обновления, чтобы я мог выполнить такое обновление за один шаг или безопасным способом?

3 образца документов:

{
"author_id": "a",
"class": "principle",
"content_id": null,
"host_id": null,
"modified_date": 1330935540,
"order": 1,
"pub_date": 1330935540,
"score": 0,
"text": "Hello World!",
"vote_down_count": 0,
"vote_up_count": 0
}

{
  "author_id": "a",
  "class": "principle",
  "content_id": null,
  "host_id": null,
  "modified_date": 1330935538,
  "order": 2,
  "pub_date": 1330935538,
  "score": 0,
  "text": "Nice to meet you.",
  "vote_down_count": 0,
  "vote_up_count": 0
}
{
  "author_id": "a",
  "class": "principle",
  "content_id": null,
  "host_id": null,
  "modified_date": 1330935548,
  "order": 3,
  "pub_date": 1330935548,
  "score": 0,
  "text": "Great!",
  "vote_down_count": 0,
  "vote_up_count": 0
}

1 Ответ

0 голосов
/ 06 марта 2012

Чтобы сделать это атомарно, все ваши три образца документа должны быть частью одного и того же документа.MongoDB выполняет только атомарные операции с простыми документами: http://www.mongodb.org/display/DOCS/Atomic+Operations

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

> db.so.find().pretty();
{
    "_id" : ObjectId("4f55e7ba362e2f2a734c92f8"),
    "subs" : [
        {
            "author_id" : "a",
            "class" : "principle",
            "content_id" : null,
            "host_id" : null,
            "modified_date" : 1330935540,
            "order" : 1,
            "pub_date" : 1330935540,
            "score" : 0,
            "text" : "Hello World!",
            "vote_down_count" : 0,
            "vote_up_count" : 0
        },
        {
            "author_id" : "a",
            "class" : "principle",
            "content_id" : null,
            "host_id" : null,
            "modified_date" : 1330935538,
            "order" : 2,
            "pub_date" : 1330935538,
            "score" : 0,
            "text" : "Nice to meet you.",
            "vote_down_count" : 0,
            "vote_up_count" : 0
        },
        {
            "author_id" : "a",
            "class" : "principle",
            "content_id" : null,
            "host_id" : null,
            "modified_date" : 1330935548,
            "order" : 3,
            "pub_date" : 1330935548,
            "score" : 0,
            "text" : "Great!",
            "vote_down_count" : 0,
            "vote_up_count" : 0
        }
    ]
}

Запрос:

db.so.update(
    { _id: new ObjectId("4f55e7ba362e2f2a734c92f8")},
    { $set : { 'subs.1.order' : 3, 'subs.2.order' : 2 } }
);

Результат:

> db.so.find().pretty();
{
    "_id" : ObjectId("4f55e7ba362e2f2a734c92f8"),
    "subs" : [
        {
            "author_id" : "a",
            "class" : "principle",
            "content_id" : null,
            "host_id" : null,
            "modified_date" : 1330935540,
            "order" : 1,
            "pub_date" : 1330935540,
            "score" : 0,
            "text" : "Hello World!",
            "vote_down_count" : 0,
            "vote_up_count" : 0
        },
        {
            "author_id" : "a",
            "class" : "principle",
            "content_id" : null,
            "host_id" : null,
            "modified_date" : 1330935538,
            "order" : 3,
            "pub_date" : 1330935538,
            "score" : 0,
            "text" : "Nice to meet you.",
            "vote_down_count" : 0,
            "vote_up_count" : 0
        },
        {
            "author_id" : "a",
            "class" : "principle",
            "content_id" : null,
            "host_id" : null,
            "modified_date" : 1330935548,
            "order" : 2,
            "pub_date" : 1330935548,
            "score" : 0,
            "text" : "Great!",
            "vote_down_count" : 0,
            "vote_up_count" : 0
        }
    ]
}
...