【问题标题】:Mongodb if exist overrideMongoDB 如果存在覆盖
【发布时间】:2017-12-14 11:03:19
【问题描述】:

我正在使用spring data mongodb从Spring bootMongodb进行通信。

文档结构:

{
    "_id" : ObjectId("5a324f8bc23fa147699ee0fb"),
    "_class" : "com.mongodb.User",
    "name" : "Prakash",
    "userId" : NumberLong(1000),
    "organisation" : "Inbytes",
    "createdOn" : ISODate("2017-12-14T10:16:43.173Z")
}

带索引:userId(唯一)

如果我插入任何具有"userId" : NumberLong(1000) 即已经存在的文档, 然后我得到这个错误

WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 11000,
        "errmsg" : "E11000 duplicate key error collection: db.user index: userId dup key: { : 1000 }"
    }
})

我有一个用例,我必须每天更新 100 万条记录。他们可能会更改他们的字段,如名称、积分等......

实现此用例的一种方法是:

find if they exist, if exist, update or override, else insert.

但是这种方法对于大量记录有很高的延迟。

是否存在更好的方法来实现我的用例。本机 MongoDB-java 和 spring mongo-DB 存储库都对我有用。

【问题讨论】:

    标签: java spring mongodb spring-boot spring-data-mongodb


    【解决方案1】:

    你得到了

    重复键错误

    因为你有 Indexed 你的 Mongo collection

    事实是,如果已经存在具有名称的索引,您正在尝试插入另一个文档,那么它不会让您插入。 因为索引是唯一的。

    实现此用例的一种方法是:

    查找它们是否存在,如果存在,更新或覆盖,否则插入

    显然,是的。因为您只能更新某些索引集合,但不能插入具有相同Index 的任何其他文档。

    【讨论】:

    • 如果我插入一个带有主索引的文档,如果它存在,它会覆盖现有的文档。我们可以在唯一索引的情况下实现这种行为吗?即,如果具有唯一索引的文档存在,它应该更新/覆盖文档的其他字段(除了 a_id 和具有唯一索引的字段)。
    猜你喜欢
    • 2023-03-12
    • 2020-06-06
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 2019-11-16
    相关资源
    最近更新 更多