Mongoose создает документ в неправильном ключе: порядок значений по схеме - PullRequest
0 голосов
/ 03 апреля 2019

Итак, у меня проблема с пониманием того, как работает операция Mongo .create и .findAndUpdate.У меня есть mongoose 5.4.2X и модель со схемой, которая имеет множество пар key:value (без вложенных объектов) в точном порядке ( в приведенном ниже коде, который я использую 1. 2. 3. и т. Д., Чтобы показать вамправильный порядок ) примерно так:

let schema = new mongoose.Schema({
    1.code: {
        type: String,
        required: true
    },
    2.realm: {
        type: String,
        required: true,
    },
    3.type: {
        type: String,
        required: true,
        enum: ['D', 'M'],
    },
    4.open: Number,
    5.open_size: Number,
    6.key: typeof value,..
    7...another one key: value like previous one,
    8.VaR_size: Number,
    9.date: {
        type: Date,
        default: Date.now,
        required: true
    }
});

и объект class, которые имеют абсолютно одинаковые свойства в том же порядке как схема выше.

Когда я формирую данные для Mongo через const contract = new Class_name (data) и используя console.log(contract), у меня есть необходимый объект со свойствами в точный правильный порядок , например:

Contract {1.code: XXX, 2.realm: YYY, 3.type: D, .... 8.VaR_size: 12, 9.date: 327438}

, но когда я пытаюсьдля создания / обновления документа в БД через findOneAndUpdate или (findByID) он записывает в алфавитном порядке, но не обязательно 1-> 9, например:

_id:5ca3ed3f4a547d4e88ee55ec
1.code:"RVBD-02.J"
7.VaR:0.9
(not the 1->9)...:...
8.VaR_size:0.22
__v:0
5.avg:169921

Полный фрагмент кода для записи:

        let test = await contracts.findOneAndUpdate(
            { 
                code: `${item_ticker}-${moment().subtract(1, 'day').format('DD.MMM')}`  //how to find
            }, 
            contract, //document for writinng and options below
            {
                upsert : true,
                new: true,
                setDefaultsOnInsert: true,
                runValidators: true,
                lean: true
            }
        ).exec();

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

Это не мой первый проект, забавно то, что когда явставка тонны документов через .insertMany документы вставляются в соответствии с порядком схемы (не в алфавитном порядке)

Мой единственный вопрос:

Как это исправить?Есть ли опция param или она входит в findAnd.... операций?Если решения не существует, что мне делать, если для меня необходимо правильно упорядочить и проверить наличие документа перед его вставкой?

Обновление # 1, через некоторое время я перефразирую свой поисковый запрос для Google инайти соответствующий вопрос по SW здесь: Порядок полей MongoDB и изменение положения документа после обновления

1 Ответ

0 голосов
/ 03 апреля 2019

Думаю, я нашел правильный ответ по ссылке, которую я разместил ранее. Так что да, это часть MongoDB:

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

от @ Берни Хэккет


Но в этом полезном комментарии все еще нет решения, верно? Неправильно. Кажется, что единственный способ избежать этой ситуации - использовать дополнительные параметры на этапе Model.find. То же упорядочение используется на этапе project через .aggregate и выглядит так:

Model.find({query},{
   "field_one":1,
   "field_two":1,
   .............
   "field_last":1
});
...