como o título diz, quero realizar um find (one) para um documento, por _id, e se não existir, fazer com que ele seja criado, então se ele foi encontrado ou criado, retorne no callback.
Não quero atualizá-lo se ele existir, como li que findAndModify faz. Tenho visto muitas outras perguntas no Stackoverflow sobre isso, mas, novamente, não desejo atualizar nada.
Não tenho certeza se ao criar (ou não existir), ESSA é na verdade a atualização de que todos estão falando, é tudo tão confuso :(
collection.findAndModify({_id:'theId'}, <your sort opts>, {$setOnInsert:{foo: 'bar'}}, {new:true, upsert:true}, callback)
. Veja os documentosdb.collection.findAndModify({query: {_id: "some potentially existing id"}, update: {$setOnInsert: {foo: "bar"}}, new: true, upsert: true})
) inseriu (upsert) ed um documento, você deve considerar o usodb.collection.updateOne({_id: "some potentially existing id"}, {$setOnInsert: {foo: "bar"}}, {upsert: true})
. Ele retorna{"acknowledged": true, "matchedCount": 0, "modifiedCount": 0, "upsertedId": ObjectId("for newly inserted one")}
se o documento foi inserido,{"acknowledged": true, "matchedCount": 1, "modifiedCount": 0}
se o documento já existe.findOneAndUpdate
,findOneAndReplace
oufindOneAndDelete
Versões do driver> 2
Usando o driver mais recente (> versão 2) , você usará findOneAndUpdate porque
findAndModify
foi descontinuado. O novo método leva 3 argumentos, ofilter
, oupdate
objeto (que contém suas propriedades padrão, que deve ser inserido para um novo objeto) eoptions
onde você deve especificar a operação de upsert.Usando a sintaxe de promessa, fica assim:
fonte
returnOriginal
deveria serreturnNewDocument
- docs.mongodb.com/manual/reference/method/…Está um pouco sujo, mas você pode simplesmente inseri-lo.
Certifique-se de que a chave possui um índice exclusivo (se você usar _id, está tudo bem, já é exclusivo).
Desta forma, se o elemento já estiver presente, ele retornará uma exceção que você pode capturar.
Se não estiver presente, o novo documento será inserido.
Atualizado: uma explicação detalhada desta técnica na documentação do MongoDB
fonte
Aqui está o que eu fiz (driver Ruby MongoDB):
$db[:tags].update_one({:tag => 'flat'}, {'$set' => {:tag => 'earth' }}, { :upsert => true })}
Ele o atualizará se existir e o inserirá se não existir.
fonte