70

我知道这可能是一个愚蠢的问题,但我在一本电子书中读到upsertMongoDB 插入中有一个选项。我找不到有关此的适当文档。有人可以教育我吗?

4

3 回答 3

140

由于upsert被定义为“当没有文档与查询条件匹配时创建一个新文档upserts”的操作,所以ininsert命令没有位置。它是update命令的一个选项。如果您执行下面的命令,它可以作为update如果有文档匹配query,或者作为参数insert描述的带有文档update

db.collection.update(query, update, {upsert: true})

MongoDB 3.2 增加replaceOne

db.collection.replaceOne(query, replacement, {upsert: true})

它具有类似的行为,但它replacement不能包含更新运算符。

于 2013-11-14T10:13:22.833 回答
7

与 PKDdb.collection.insert()提供的链接一样,不提供 upsert 可能性。相反,mongo insert 将新文档插入到集合中。Upsert 只能使用db.collection.update()and db.collection.save()

如果您碰巧传递了一个文档,db.collection.insert()该文档已经在集合中,因此_id与现有的类似_id,它将引发重复键异常。

于 2013-11-14T10:16:05.423 回答
0

对于使用 java 驱动程序更新单个文档:

FindOneAndReplaceOptions replaceOptions = new FindOneAndReplaceOptions();
replaceOptions.upsert(true);
collection.findOneAndReplace(
        Filters.eq("key", "value"),
        document,
        replaceOptions
);

尽管应该确保唯一性,Filters.eq("key", "value")否则可能会添加多个文档。看到这个了解更多

于 2022-02-17T10:08:01.790 回答