2015-01-30 3 views
1

Я хочу, чтобы отсортировать элементы MongoDB массив с условиемMongod DB заказ элемент массива обновление с условием

Предположим, мой массив как

{ 
    "id":1, 
    "array":[ 
     { 
      "id" : "150", 
      "place" : "US" 
     }, 
     { 
      "id" : "1250", 
      "place" : "UK" 
     }, 
     { 
      "id" : "1350", 
      "place" : "AUS" 
     } 
    ]  
} 

Тогда я хочу, чтобы сортировать и обновлять «массив» Eg: Я хотите организовать массив значение элемента "ID", чтобы 1250, 1350, 150

Мой обновленный документ будет выглядеть

{ 
    "id":1, 
    "array":[ 
     { 
      "id" : "1250", 
      "place" : "UK" 
     }, 
     { 
      "id" : "1350", 
      "place" : "AUS" 
     }, 
     { 
      "id" : "150", 
      "place" : "US" 
     }, 
    ]  
} 
+1

Вы хотите перенести первый элемент массива вправо вправо? вращать на один? –

+0

Не вращать, я хочу упорядочить порядок в соответствии с заданным порядком значения id – Mayur

ответ

2

Используйте оператора $push с модификаторамии $sort.

db.collection.update({"id":1}, 
        {$push:{"array":{$each:[],$sort:{"id":1}}}}) 

Переходя к пустой массив модификатора $each, гарантирует, что не было добавлено никаких дополнительных элементов и только существующие элементы сортируются на основе id поля в восходящей лексического порядка (так как id имеет тип строки).

Чтобы использовать модификатор $sort, он должен появиться с модификатором $each. Вы можете передать пустой array [] модификатору $each таким образом, чтобы только модификатор $sort имел эффект.

Если вы хотите отсортировать его на основе какой-то приоритет на поле идентификатора, то вы можете сделать это в вас коде приложения, как показано ниже:

// define an array of elements with decreasing priority 
var sortOrder = ["1250","1350","150"]; 

// find and update all the documents 
db.collection.find().forEach(function(doc){ 
    var arr = doc.array.sort(function(a,b){ 
     return (sortOrder.indexOf(a.id) - sortOrder.indexOf(b.id)); 
    }) 
    db.collection.update({"_id":doc._id},{$set:{"array":arr}}); 
}) 

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

Имейте сопоставление для поля id, чтобы определить порядок, в котором элементы должны быть отсортированы в поле массива.

var sortOrder = ["1350","1250","150"]; 

Всякий раз, когда вы хотите insert/update, выполнить upsert операцию, используя $position оператор, который inserts/updates поле массива с новым элементом в соответствующей позиции на основе sortOrder массива.

var elementToInsert = {"id":"1350","place":"UK"}; 
db.collection.update({"id":1}, 
      {$push:{"array":{$each: 
         [elementToInsert], 
         $position:sortOrder.indexOf(elementToInsert.id)}}}, 
      {"upsert":true}) 
+0

Я получил это, но я хочу упорядочить его с заданным порядком идентификаторов, например, если я хочу сохранить элемент с значением id 1250 в первой позиции, элемент с значение id 1350 во второй позиции и 150 в третьей позиции, так как я должен это делать – Mayur

+1

Если вы не можете указать требуемый порядок с аргументом '$ sort' в вышеуказанном решении, вам нужно получить документ, изменить сторона клиента массива должна быть в соответствующем порядке, а затем обновить документ в базе данных с помощью нового, примененного массива. – wdberkeley

Смежные вопросы