gpt4 book ai didi

java - MongoDB:使用唯一索引更新插入

转载 作者:可可西里 更新时间:2023-11-01 09:51:02 25 4
gpt4 key购买 nike

我必须说我不是真正的 mongoDB 专家,但这是我正在努力做的事情。

我有一个应用程序,每次打开该应用程序时都会获取“食物”对象的提要,该提要是从外部 Web API 服务接收的。由于与外部 API 服务达成 ToS 协议(protocol),我只能为这些对象中的每一个保存唯一“食物”ID。

现在,每次打开应用程序时,我都会获取食物对象的提要,我只想在我的 mongoDB 中保存一次食物对象 ID(“foodId”)。因此,我决定每次打开应用程序时都进行更新。我不确定这是否是编写 upsert 方法的最佳方式,因为您可以看到查询参数和更新参数相同并且都与“foodId”相关:

                    Query query = new Query();
query.addCriteria(Criteria.where("foodId").in(foodIdfromApi));
Update update = new Update();
update.set("foodId", foodIdfromApi);
mongoTemplate.upsert(query, update, Food.class);

由于“foodId”是唯一的,我在“foodId”上创建了一个唯一索引

这是来自 MongoDB 的: http://docs.mongodb.org/manual/reference/method/db.collection.update/#upsert-option

To prevent MongoDB from inserting the same document more than once, create a unique index on the name field. With a unique index, if multiple applications issue the same update with upsert: true, exactly one update() would successfully insert a new document.

The remaining operations would either:

update the newly inserted document, or fail when they attempted to insert a duplicate. If the operation fails because of a duplicate index key error, applications may retry the operation which will succeed as an update operation.

我的应用程序在第一次运行时成功下载了提要。但随后,每次我想进行更新插入时(这是每次我打开我的应用程序时),它都会给我重复的索引键错误。

Write failed with error code 11000 and error message 'E11000 duplicate key error index

我不想删除唯一索引,因为这样可能会存在重复的食物对象。我该如何解决这个问题?

最佳答案

您没有删除唯一索引是对的。正如您在文档中指出的那样,这在 mongo 中是必需的。

要解决他们在尝试更新插入时出现问题时抛出错误的选择,您应该捕获错误并重试。

我没有使用 mongo 模板,但这里有一个使用 Java 驱动程序的示例。您可以尝试类似的方法:

MongoCollection<Document> collection = mongo.getCollection("Revenue");
UpdateResult result;
try {
result = collection.replaceOne(searchDoc, repsertDoc, new UpdateOptions().upsert(true));
} catch (MongoException e) {
// Retry once on error, can sleep here too if you'd like
result = collection.replaceOne(searchDoc, repsertDoc, new UpdateOptions().upsert(true));
// If this attempt fails, can always re-try again or fail
}

关于java - MongoDB:使用唯一索引更新插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33125034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com