MongoDBprimefaces的“findOrCreate”:findOne,如果不存在则插入,但不更新

如标题所示,我想通过_id为文档执行查找(一个),如果不存在,是否创build它,然后是否已find或已创build,是否在callback中返回。

如果它存在,我不想更新它,因为我已经阅读findAndModify。 我已经看到了许多关于这个Stackoverflow的其他问题,但再次,不希望更新任何东西。

我不确定是否通过创build(不存在),这实际上是每个人都在谈论的更新,这都是如此令人眼花缭乱:(

从MongoDB 2.4开始,不再需要为primefacesfindOrCreate类似的操作依赖唯一索引(或任何其他解决方法)。

这要归功于新增的$setOnInsert操作符 ,它允许您指定只在插入文档时发生的更新。

这与upsert选项结合,意味着您可以使用findAndModify来实现primefacesfindOrCreate like操作。

 db.collection.findAndModify({ query: { _id: "some potentially existing id" }, update: { $setOnInsert: { foo: "bar" } }, new: true, // return new doc if one is upserted upsert: true // insert the document if it does not exist }) 

由于$setOnInsert只影响被插入的文档,所以如果find一个现有的文档,不会发生修改。 如果不存在任何文档,则会使用指定的_id插入一个文档,然后执行仅插入的设置。 在这两种情况下,都会返回文档。

它有点脏,但你可以插入它。

确保键上有一个唯一的索引(如果使用了_id,那么它已经是唯一的了)。

通过这种方式,如果元素已经存在,它将返回一个你可以捕获的exception。

如果不存在,则插入新文档。

更新:在MongoDB文档上详细解释这种技术

这就是我所做的(Ruby MongoDB驱动程序):

$db[:tags].update_one({:tag => 'flat'}, {'$set' => {:tag => 'earth' }}, { :upsert => true })}

它会更新它,如果它不存在,插入它。