Порядок полей MongoDB и изменение положения документа после обновления - PullRequest
18 голосов
/ 19 февраля 2011

Я изучаю 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"}

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

Ответы [ 7 ]

20 голосов
/ 19 февраля 2011

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

10 голосов
/ 16 апреля 2014

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

  1. Поле _id всегда является первым полем в документе.
  2. Обновления, включающие переименование имен полей, могут привести к переупорядочению полей в документе.
6 голосов
/ 23 июня 2011

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

4 голосов
/ 19 февраля 2011

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

Случай 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: изменяется размер поля, и поляreodered

> 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

2 голосов
/ 14 марта 2014

Я создал проект, который создает пользовательский mongorc.js, который сортирует ключи документов по умолчанию для вас.Это называется Монго Хакер

0 голосов
/ 14 марта 2019

Чтобы все поля были в нужном порядке, я вставил все документы со свойствами в правильном порядке в другую коллекцию. Затем я удалил старую коллекцию и переименовал новую коллекцию в первоначальное имя. Очевидно, сначала сделайте резервную копию ваших данных.

0 голосов
/ 07 ноября 2013

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

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

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

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

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