Атомное переупорядочение элементов во вложенном массиве документа MongoDB - PullRequest
3 голосов
/ 30 декабря 2011

У меня есть документ с вложенным массивом упорядоченных элементов, и мне нужно атомарно переупорядочить элементы в этом массиве.

  1. Является ли код на стороне сервера правильным решением для этой задачи?
  2. Является ли серверный код единственным решением для этой задачи?
  3. в рамках этого кода будет блокироваться:
    • один документ
    • одна коллекция
    • весь сервер?

это код, который будет выполняться на стороне сервера:

var reorder = function (
    catalog_id,
    parent_id,
    item_id,
    new_pos) {

    var old_pos;

    var collection = db.catalogs;
    var catalog = collection.findOne({catalog_id:catalog_id});
    var result = [];

    for(i in catalog.list) {

        var item = catalog.list[i];

        if(item.id == item_id) {

            old_pos = item.order;
            result.push({old_pos:old_pos});
            break;
        }
    }

    if(old_pos == new_pos)
        return result;

    var up = new_pos < old_pos;

    catalog.list.forEach(function(item){

        if( item.parent == parent_id &&
            (up ?
                (item.order <= old_pos && item.order >= new_pos) :
                (item.order <= old_pos && item.order >= new_pos))){

            if(item.id != item_id) {

                item.order++;
                result.push({down:item});
            }
            else {

                item.order = new_pos;
                result.push({up:item});
            }

            collection.update(
                {catalog_id:catalog_id, 'list.id':item.id},
                {$set:{'list.$.order':item.order}});
        }
    });

    return result;
};

reorder('diagnostic_graph', 'n1', 'n5', 1);

это пример данных:

{
  "_id" : ObjectId("4efc939094f4a115d80c8543"),
  "catalog_id" : "diagnostic_graph",
  "list" : [{
      "id" : "n1",
      "order" : 0
    }, {
      "id" : "n2",
      "parent" : "n1",
      "order" : 0
    }, {
      "id" : "n3",
      "parent" : "n1",
      "order" : 1
    }, {
      "id" : "n4",
      "parent" : "n1",
      "order" : 2
    }, {
      "id" : "n5",
      "parent" : "n1",
      "order" : 3
    }]
}

PS.извините, если что-то неясно - английский не лучший мой навык

1 Ответ

0 голосов
/ 07 апреля 2013

Q 1. Является ли серверный код правильным решением для этой задачи?

A 1. Это зависит. Если массив необходимо переупорядочивать всякий раз, когда вы его используете, вам следует переупорядочивать его всякий раз, когда вы добавляете элемент в массив. Вы можете вызывать код на стороне сервера .js всякий раз, когда вы помещаете элемент в массив или делаете это в своем приложении.

Q 2. Является ли серверный код единственным решением для этой задачи?

A 2. Как я уже говорил в ответе на первый вопрос, это не единственное решение.

Q 3. В области видимости этот код будет блокироваться:

A 3. Ответ - один документ (AFAIK).

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