2013-06-12 2 views
5

Есть ли способ обновить массив документов, чтобы переместить элемент из одного индекса в другой? , например.Как перенести элемент в массив MongoDB?

{ 
    name: "myDoc", 
    items: ["it1", "it2", "it3"] 
} 

В результате для JQuery-UI Sortable event it2 и it3 переключаются местами. В результате я хочу обновить свою позицию в myDoc, который хранится в MongoDB.

+2

Нет, это не способ сделать это в одном шаге. Http: //docs.mongodb.орг/ручной/ссылки/оператора/# операторы. На самом деле даже нет способа вставить элемент в определенный индекс. Это нерешенная/открытая проблема: https://jira.mongodb.org/browse/SERVER-2363. Вам нужно будет переписать весь список массивов. – WiredPrairie

+1

Как вы думаете, что будет лучше для этого? –

+0

UPDATE: начиная с версии 2.6.you вставить в определенный индекс, используя $ position - https://docs.mongodb.org/manual/reference/operator/update/position/ –

ответ

1

Пока что нет возможности сделать это прямо в монго с любым водителем.

Вам необходимо сделать это в своем приложении и установить массив с монго.

например:

var new_array = ["it2","it1","it3"];//Do your sort/place in js 

$mongo_connexion->update({"name": "myDoc"}, {$set: {"items" : new_array}}); 
1

Вот еще один способ, чтобы переместить элемент в новое положение, которое поменяет позицию IT2 и IT3 ...

  1. Удалить элемент из массива используя $ pull [ Docs Here ].

    update({"name": "myDoc"}, {$pull: {"items" : "it3"}}); 
    
  2. Вставьте элемент в новое положение, используя $ push. [ Docs Here ].

    update({"name": "myDoc"}, { 
        $push: { 
         "items" : { $each : [ "it3" ], $position : 1 } 
        } 
    }); 
    

Когда использовать

ответ Pouzor, чтобы использовать $ набор может быть проще и лучше для многих случаев применения.

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

В некоторых случаях это может быть более эффективным (например, большие элементы массива), поскольку записывается меньше данных.

GOTCHA: Список списков

Если список вы переназначения массив массивов, которые необходимо использовать $ все оператора с $ тянуть [ Docs Here ]

Возьмем такой пример:

{ 
    name: "myDoc", 
    items: [ 
     [ "User", "dofij20r91dj93" ], 
     [ "User", "239vjvidjfsldf" ], 
     [ "User", "2309jvdsjdkk23" ] 
    ] 
} 

Код -, чтобы удалить первый список из списка списков:

update({"name": "myDoc"}, { 
    $pull: { 
     "items" : { 
      $all : [ "User", "dofij20r91dj93" ] // the sub-list to $pull 
     } 
    } 
}); 

Список объектов

Это легко. Скажем, у вас есть следующий список объектов:

{ 
    name: "myDoc", 
    items: [ 
     { type: "User", id: "dofij20r91dj93", name: "Dave" }, 
     { type: "Group", id: "239vjvidjfsldf", name: "Accountants" }, 
     { type: "User", id: "2309jvdsjdkk23", name: "Toni" } 
    ] 
} 

Вы можете $ тянуть, как это:

update({"name": "myDoc"}, { 
    $pull: { 
     "items" : { type: "User", id: "dofij20r91dj93" } 
    } 
}); 
Смежные вопросы