Мангуст обновляет только выбранные поля или вставляет - PullRequest
2 голосов
/ 24 апреля 2019

Название может звучать как findOne с $set, но почему-то я не получаю его так, как я хотел.

Для начала у меня есть схема Ticket

const Ticket = new Schema(Object.assign({
    ticketNumber: { type: String, required: true },
    year: { type: Schema.Types.Mixed, default: [] },  // object

}, BaseSchema), { timestamps: true });

тогда у меня есть функция для записи данных в дб.

У меня есть макет данных в приведенном ниже коде тоже

exports.writeToDB = async () => {
    const data = [
        {
            ticketNumber: 123456789,
            year: 2019,
            notes: 'hello there',
            more: 'there should be more fields here'
        },
        {
            ticketNumber: 987654321,
            year: 2020,
            notes: 'hello there again',
            more: 'there should be more fields here again'
        }
    ];

    data.forEach(d => {
        console.log(d, 'ddd');
        const { ticketNumber, year, ...contents } = d;
        const query = { ticketNumber };
        const update = {
            'year': { [year]: contents }
        };
        const options = { upsert: true };
        Ticket.updateOne(query, update, options, (err, doc) => {
            console.log(doc, 'docc');
        })
    })
};

в схеме, есть только ticketNumber и year Все хорошо, чтобы начать с того, что я пытаюсь сделать, год может отличаться, и ticketNumber останется прежним.Каждый раз, когда данные передаются и если ticketNumber найдено, то update в соответствии с year, если year не найдено, вместо этого insert.

образец того, что будетв дБ это

{
    ticketNumber: 123456789,
    year: {
        2019: {
            notes: 'hello there',
            more: 'there should be more fields here'
        }
    }
};

, если данные передаются с тем же годом 2019, тогда он обновит поля notes и more плюс другие поля, но если данные будут переданы с другимгод, такой как 2020, тогда то, что в дБ должно выглядеть ...

{
    ticketNumber: 123456789,
    year: [
        2019: {
            notes: 'hello there',
            more: 'there should be more fields here'
        },
        2020: {
            notes: 'hello there',
            more: 'there should be more fields here'
        },
    ]
};

Я пытался настроить мою переменную update на такие

const update = {
    $set: {'year': { [year]: contents }}
};


const update = {
    'year': $set{ [year]: contents }
};

, но оба онине работают, хотя, во-первых, перезаписать весь объект (вид того, что ожидается).Второй фактически ничего не делает

Любые предложения о том, что я должен делать, или есть другая логика, которую я должен предоставить вместо использования чего-то вроде $set?

Заранее спасибо за любую помощьи предложения.

1 Ответ

1 голос
/ 25 апреля 2019

Я проверил API Mongoose, и метод Model.update имеет это примечание в документации :

Все ключи верхнего уровня, которые не являются атомарными именами операций, рассматриваются как операции набора:

Пример :

var query = { name: 'borne' };
Model.update(query, { name: 'jason bourne' }, options, callback);

// is sent as
Model.update(query, { $set: { name: 'jason bourne' }}, options, function(err, res));
// if overwrite option is false. If overwrite is true, sent without the $set wrapper.

Это означает, что вам не нужно вручную указывать $set при использовании Model.update на mongoose, просто сделайте следующее:

const update = {
    [`year.${year}`]: contents
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...