Используйте оператора $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})
Вы хотите перенести первый элемент массива вправо вправо? вращать на один? –
Не вращать, я хочу упорядочить порядок в соответствии с заданным порядком значения id – Mayur