gpt4 book ai didi

java - MongoDB Java驱动程序: Insert document if it does not exist else do nothing

转载 作者:行者123 更新时间:2023-12-02 12:03:12 25 4
gpt4 key购买 nike

我正在尝试编写一个 Java 函数,将单词列表插入到集合中。我想要一个包含唯一字段“word”的单词的文档。我想要插入的单词列表包含许多重复项,因此我希望我的函数仅在集合内不存在具有相同“单词”值的文档时插入文档。如果已经存在具有相同“单词”值的文档,则该函数不应更改或替换该文档,而是继续从列表中插入下一个单词。

我在字段“word”上创建了一个索引,以避免重复文档并捕获重复键异常,但我不确定这是否是处理此问题的正确方法。

    IndexOptions uniqueWord = new IndexOptions().unique(true);
collection.createIndex(Indexes.ascending("word"), uniqueWord);


try {
File file = new File("src/words.txt");
Scanner scanner = new Scanner(file);


while (scanner.hasNextLine()) {
String word= scanner.next();

Document document = new Document();
document.put("word", word);

InsertManyOptions unordered= new InsertManyOptions();
ArrayList<Document> docs = new ArrayList<>();
docs.add(document);

try{
collection.insertMany(docs, unordered.ordered(false));
}catch(Exception e){
//System.out.println(e.getMessage());
}

最佳答案

你写道:

If there's already a document with the same "word"-value the function should not change or replace this document but go on inserting the next word from my list .

这排除了使用原子操作,例如 findOneAndUpdatefindOneAndReplaceupsert: true

相反,我认为您的选择仅限于预写检查,例如:

if (collection.count(Filters.eq("word", "..."))) {
// insert
} else {
// ignore because there is already a document for this word
}

如果您的编写器是多线程的,则这可能会受到可能的竞争条件的影响。当一个线程对来自 collection.count() 的错误结果使用react时,另一个线程设法为该单词写入一个条目。 findOneAndReplace 是原子性的,因此不容易出现该问题,

我建议您应该将 findOneAndReplaceFindOneAndReplaceOptions.upsert == true 一起使用,这将与忽略已写入的文档具有相同的最终结果(尽管用相同的文档替换它)但它可能比应用预写如果存在检查更安全。

更新您编辑的问题意味着您正在“插入许多”,但每次循环时您只插入一个文档(尽管使用collection.insertMany()),所以上述建议仍然有效。例如:

while (scanner.hasNextLine()) {
String word= scanner.next();

if (collection.count(Filters.eq("word", word)) == 0L) {
Document document = new Document();
document.put("word", word);

collection.insertOne(document);
}
}

关于java - MongoDB Java驱动程序: Insert document if it does not exist else do nothing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47098136/

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