Mongoose findOneAndUpdate и upsert не возвращает никаких ошибок, никаких документов не влияет

У меня очень минимальная модель:

var CompanySchema = new mongoose.Schema({
    name: { type: String, required: true, unique: true },
});

var Company = mongoose.model('Company', CompanySchema)

Я пытаюсь добавить один документ, если он не существует. В настоящее время нет документов, пока я тестирую:

models.Company.findOneAndUpdate({
    name: 'companyName'
}, {upsert: true}, function(err, numberAffected, raw){
    console.log(err, numberAffected, raw)
})

Это использует upsert параметры из документов Mongoose

Однако err есть null, numberAffected равно null. Почему мой документ не обновлен?

Ответы

Ответ 1

в вашем коде вы используете 3-мерную версию метода findOneAndUpdate, поэтому, согласно опубликованной документации, параметры: A.findOneAndUpdate(conditions, update, callback).

Вы должны использовать версию метода 4-го параметра для указания опции upsert.

Я хотел бы отметить, что я никогда не использовал рамки mongoose. Надеюсь, это поможет.

Изменить: Да, в вашем случае conditions и update совпадают. Если ваш объект более сложный, то тот, который показан в примере, вы можете проверить атрибут _id или "уникальный" (не гарантированный MongoDB) (лучше, если на нем есть индекс). Например:

var myObj = ...;
collection.findOneAndUpdate({uniqueAttr: myObj.uniqueAttr}, myObj, {upsert: true}, function(){
     ...
});

Ответ 2

Начиная с Mongoose 4+, не забудьте установить new: true вместе с upsert или вы получите старый документ как возвращаемое значение, а не обновленное.

Это довольно сложно, особенно когда запрос создает документ, как будто вы не указываете new: true, вы получаете нулевой документ (не было никакого существующего документа), но ошибки не было.

    var myObj = ...;
    collection.findOneAndUpdate(
    {uniqueAttr: myObj.uniqueAttr},
    myObj,
    {upsert: true, new: true},
    function(...) {...}