Порядок заказа MongoDB и изменение позиции документа после обновления

Я изучаю MongoDB, и я заметил, что всякий раз, когда я делаю обновление в документе, обновляемое поле подталкивается к концу порядка, поэтому, если бы у меня было что-то вроде:

db.collection.save({field1: value1, field2: value2, ..., field 10: value10});
db.collection.update({field1: value1}, {$set: {field2: new_value}});

то если:

db.collection.find();

он отобразит:

{ "field1":"value1", ..., "field10":"value10", "field2":"new_value"}

Вы можете увидеть, как изменяется порядок полей, когда обновленное поле помещается в конец документа. Кроме того, сам документ подталкивается к концу коллектора. Я знаю, что это "без схемы" DB, и это может быть не огромная проблема, но она просто не выглядит "красивой":). Есть ли способ сделать обновление на месте без изменения порядка?

Ответы

Ответ 1

MongoDB выделяет пространство для нового документа на основе определенного коэффициента заполнения. Если ваше обновление увеличивает размер документа за пределами первоначально выделенного размера, документ будет перемещен в конец коллекции. Эта же концепция применяется к полям в документе.

Ответ 2

Структура и структура документов в MongoDB на основе принципов JSON. JSON - это набор пар ключ/значение (в частности fieldName/fieldValue для документа и индекса/документа для сбора). С этой точки зрения, похоже, что вы не можете вообще ретранслировать.

Ответ 3

FYI, в MongoDB 2.6 обновления сохранят порядок полей со следующими исключениями:

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

Ответ 4

В случае документов, если размер поля изменяется, он выписывает новый документ с полями, отсортированными по имени поля. Это поведение можно увидеть со следующими утверждениями

Случай 1: никаких изменений в размере поля, поэтому изменение порядка полей

> db.testcol.find()
> db.testcol.save({a:1,c:3,b:2})
> db.testcol.find()
{ "_id" : ObjectId("4d5efc3bec5855af36834f5a"), "a" : 1, "c" : 3, "b" : 2 }
> db.testcol.update({a:1},{$set:{c:22}})
> db.testcol.find()
{ "_id" : ObjectId("4d5efc3bec5855af36834f5a"), "a" : 1, "c" : 22, "b" : 2 }

Случай 2: изменения размера поля и поля отображаются повторно

> db.testcol.find()
> db.testcol.save({a:1,c:"foo",b:2,d:4})
> db.testcol.find()
{ "_id" : ObjectId("4d5efdceec5855af36834f5e"), "a" : 1, "c" : "foo", "b" : 2, "d" : 4 }
> db.testcol.update({a:1},{$set:{c:"foobar"}})
> db.testcol.find()
{ "_id" : ObjectId("4d5efdceec5855af36834f5e"), "a" : 1, "b" : 2, "c" : "foobar", "d" : 4 }

Есть ли особая причина, по которой вы не хотите, чтобы поля были переупорядочены? Выше было использование 1.8.0_rc0 на OS X

Ответ 5

Я создал проект, который создает пользовательский файл mongorc.js, который по умолчанию сортирует ключи документа по умолчанию. Он назывался Mongo Hacker

Ответ 6

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

Например, в perl to_json есть опция canonical

print to_json( $data, { utf8 => 1, pretty => 1, convert_blessed => 1, canonical => 1 } );

(опция canonical) будет выводить объекты JSON, сортируя их ключи. Это добавляет сравнительно высокие накладные расходы. (конечно, мы делаем больше операций сортировки...)