【问题标题】:Duplicate documents in insertMany()insertMany() 中的重复文档
【发布时间】:2021-08-11 09:58:34
【问题描述】:

insertMany() 中的重复文档

嗨。我对 insertMany() 函数有很大的问题。 我的目标是:

  • 观察名为“List.json”的文件
  • 如果有变化,则读取文件
  • 然后将文件List.json中的文档写入数据库mongoDb List.json 文件由用户在页面上上传。

问题是我的功能正在运行,但它在 2 或 3 次后给我写文档。我不知道它是由什么引起的。 我希望 List.json 文件中的一份文档仅添加 1 次。 如果可能的话,我希望程序检查数据库中是否已经存在具有给定“Nazwisko”的文档。如果存在,则不要将其添加到数据库中。

我不使用 Moongose。 我只使用 mongoDb 和 node.js 我对mongo知之甚少

这是我的功能

fs.watch(file("Lista.json"), function (eventType, filename) {
  fs.readFile(file(filename), function (err, data) {

    const bazaJson = data; //fs.readFileSync(file("Lista.json").toString());
    const bazaJson1 = bazaJson.toString();
    const bazaJsonObject = JSON.parse(bazaJson1);

    client.connect((err) => {
      if (err) {
        console.log("błąd polaczenia /manySaveDatabase");
        client.close();
      } else {
        const db = client.db("test"); //pobieram nazwe bazy danych test
        const candidate = db.collection("candidate"); // nazwa naszej kolekcji
        console.log("polaczenie udane z bazą /manySaveDatabase");

        try {
          candidate.insertMany(bazaJsonObject, {
            ordered: false,
          });
        } catch (e) {
          console.log("wystąpil blad e: ", e);
        }
      }
    });
  });
});

这是我的 List.json 文件内容

[
  {
    "Imie": "Katarzyna",
    "Nazwisko": "Mongoł",
    "Miejscowosc": "Kraków (Kraków-Śródmieście)",
    "Angielski": "Angielski C2"
  },
  {
    "Imie": "Marieta",
    "Nazwisko": "Mongołacc",
    "Miejscowosc": "Rybnik",
    "Angielski": "Angielski C1",
  },
  {
    "Imie": "Marieta",
    "Nazwisko": "Mcc",
    "Miejscowosc": "Rybnik",
    "Angielski": "Angielski C1"
  }
]

此图像显示了在对 List.json 文件进行一次更改期间,一个文档被添加了 2 次。

我已经在 stackoverflow 论坛上查看了与重复相关的类似主题。但是,它们都没有解决我的问题。 就我而言,每个文档都上传了 1 次以上。上传 100 个此类文档将向数据库添加 200 条记录。 请帮忙

【问题讨论】:

    标签: node.js json mongodb


    【解决方案1】:

    从您发布的代码 sn-p 看来一切都很好,我认为正在发生的事情是您正在使用 watch 跟踪文件更改(我假设不同的进程将数据写入该文件或类似的东西),它只会触发多次。

    insertMany 正在按预期工作,由于多次文件更改,您只是多次插入同一个文档。

    我要做的是在定义文档唯一性的相关字段(可能是所有字段)上构建unique index

    现在,当您尝试插入违反唯一性约束的文档时,它将失败,重要的是要注意,如果您选择此解决方案,则必须为insertMany 使用ordered: false 选项。如果您出于某种原因选择将其删除,则插入失败将使尚未插入的任何文档也失败。

    为作为唯一索引一部分的任何键插入重复值,...如果 ordered 为 false,插入操作将继续处理任何剩余的文档。

    【讨论】:

      【解决方案2】:

      非常感谢@Tom Slabbaert

      最终,我应用了这个解决方案:

      [
        {
          "_id": "Mongoł",
          "Imie": "Katarzyna",
          "Nazwisko": "Mongoł",
          "Miejscowosc": "Kraków (Kraków-Śródmieście)",
          "Angielski": "Angielski C2"
        },
        {
          "_id": "Mongołacc",
          "Imie": "Marieta",
          "Nazwisko": "Mongołacc",
          "Miejscowosc": "Rybnik",
          "Angielski": "Angielski C1",
        },
        {
          "_id": "Mcc",
          "Imie": "Marieta",
          "Nazwisko": "Mcc",
          "Miejscowosc": "Rybnik",
          "Angielski": "Angielski C1"
        }
      ]
      
      fs.watch(file("Lista.json"), function (eventType, filename) {
        const bazaJson = fs.readFileSync(file("Lista.json").toString());
        const bazaJson1 = JSON.stringify(bazaJson.toString());
        const bazaJsonObject = JSON.parse(bazaJson1);
       
        var array = [];
        for (var key in bazaJsonObject) {
          array.push(JSON.parse(bazaJsonObject));
        }
      
        client.connect((err) => {
          if (err) {
            client.close();
          } 
          else {
            const db = client.db("test"); 
            const kandydaci = db.collection("kandydaci");
      
            try {
              if (array.length != 0) {
                kandydaci.insertMany(array[0], { ordered: false });
              }
            } catch (e) {
              
              e.getWriteErrors().forEach(function (err) {
                if (err.code != 11000) {
                  throw e;
                }
              });
            }
          }
        });
      });
      

      我还发现这篇文章很有帮助: http://man.hubwiz.com/docset/MongoDB.docset/Contents/Resources/Documents/docs.mongodb.org/manual/reference/method/db.collection.insertMany/index.html

      【讨论】:

        【解决方案3】:

        不幸的是,还有另一个与 _id 相关的错误 当我设置_id : "Surname"时,文件上传成功。但除了上传文件之外,我的应用程序还允许编辑添加的文档。 编辑文档是基于 mongoDB 生成的唯一 _id 完成的。 所有由 mongo 提供的具有_id 的文档都可以编辑。我分配给自己的那些是不可编辑的。 我曾尝试通过电子邮件下载用户,但他们有时会重复自己,因为在数据库中我有时会有同一个人拥有不同的数据。 有人可以给点建议吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-12
          • 1970-01-01
          • 2021-08-23
          • 1970-01-01
          • 2016-08-28
          • 1970-01-01
          • 2012-07-16
          • 1970-01-01
          相关资源
          最近更新 更多