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(...) {...}