как говорится в заголовке, я хочу выполнить поиск (один) для документа по _id, и если он не существует, создать его, а затем, независимо от того, был ли он найден или создан, вернуть его в обратном вызове.
Я не хочу обновлять его, если он существует, как я читал, это делает findAndModify. Я видел много других вопросов по этому поводу в Stackoverflow, но опять же, не хочу ничего обновлять.
Я не уверен, что, создавая (или не существуя), ЭТО на самом деле является обновлением, о котором все говорят, все это так сбивает с толку :(
collection.findAndModify({_id:'theId'}, <your sort opts>, {$setOnInsert:{foo: 'bar'}}, {new:true, upsert:true}, callback)
. См. Документациюdb.collection.findAndModify({query: {_id: "some potentially existing id"}, update: {$setOnInsert: {foo: "bar"}}, new: true, upsert: true})
) insert (upsert) , вам следует рассмотреть возможность использованияdb.collection.updateOne({_id: "some potentially existing id"}, {$setOnInsert: {foo: "bar"}}, {upsert: true})
. Возвращается,{"acknowledged": true, "matchedCount": 0, "modifiedCount": 0, "upsertedId": ObjectId("for newly inserted one")}
если документ вставлен,{"acknowledged": true, "matchedCount": 1, "modifiedCount": 0}
если документ уже существует.findOneAndUpdate
,findOneAndReplace
илиfindOneAndDelete
Версии драйверов> 2
Используя последний драйвер (> версии 2) , вы будете использовать findOneAndUpdate, поскольку
findAndModify
он устарел. Новый метод принимает 3 аргумент,filter
, тоupdate
объект (который содержит ваши свойства по умолчанию, которые должны быть вставлены для нового объекта), иoptions
где вы должны указать операцию upsert.Используя синтаксис обещания, это выглядит так:
источник
returnOriginal
должно быть,returnNewDocument
я думаю - docs.mongodb.com/manual/reference/method/…Немного грязно, но можно просто вставить.
Убедитесь, что ключ имеет уникальный индекс (если вы используете _id, все в порядке, он уже уникален).
Таким образом, если элемент уже присутствует, он вернет исключение, которое вы можете перехватить.
Если его нет, будет вставлен новый документ.
Обновлено: подробное объяснение этого метода в документации MongoDB.
источник
Вот что я сделал (драйвер Ruby MongoDB):
$db[:tags].update_one({:tag => 'flat'}, {'$set' => {:tag => 'earth' }}, { :upsert => true })}
Он обновит его, если он существует, и вставит его, если его нет.
источник