Upsert ref документы при нажатии на массив в Express

У меня есть схема Candidate с массивом ссылок на схему Endorser. Вот так:

const CandidateSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true,
        trim: true
    },
    endorsements: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Endorser'
    }]
});

const EndorserSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true,
        trim: true
    },
});

Я получаю endorsements в виде массива строк (то есть имени индоссанта). Я хочу выполнить итерацию по этому массиву и получить _id каждого из Endorser модели или добавить новую, если она не существует. Затем я хочу вставить эти ссылки в существующий экземпляр candidate.

Следующий код работает, но мне действительно неудобно изменять экземпляр candidate в памяти. Необходимость выполнять разрешение промисов отдельно также кажется странной.

    const endorsementPromises = endorsements.map(async endorser => {
        let endorserObj = await Endorser.findOneAndUpdate({name: endorser}, {name: endorser}, {upsert: true, new: true});
        return endorserObj._id;
    });
    const endorsementArray = await Promise.all(endorsementPromises);
    candidate.endorsements = candidate.endorsements.concat(endorsementArray);
    await candidate.save();

Я пробовал использовать findOneAndUpdate с $push и $each. Однако это только возвращает ошибку и не обновляет документ.

Candidate.update(
        {id: candidate._id}, 
        {$push: {
            endorsements: {
                $each: endorsementArray
            }
        }}
    );
// the error
Error: {"n":0,"nModified":0,"ok":1}

Я не уверен, почему $push и $each не обновляют документ.

Любое руководство будет действительно оценено.

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
0
15
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте использовать $addToSet вместо $push. Кроме того, кажется, что вы должны сопоставлять _id вместо id в своем обновлении.

Возвращает ту же ошибку и не обновляет базу данных.

Neighlyd 21.05.2019 22:52

Похоже, у вас может быть опечатка в вашем запросе. В вашем update вы должны сопоставлять _id вместо id?

developing2020 21.05.2019 22:54

Упс! Вот и все! Теперь я чувствую себя немым.

Neighlyd 21.05.2019 22:56

Ха-ха, обычно это что-то маленькое, рад, что смог помочь!

developing2020 21.05.2019 22:57

Другие вопросы по теме