【问题标题】:how does "insertMany" work with Mongoose when using Node.js with mongoDB?将 Node.js 与 mongoDB 一起使用时,“insertMany”如何与 Mongoose 一起使用?
【发布时间】:2021-01-02 13:43:24
【问题描述】:

我正在学习 Node.js 并尝试使用 mongo db 并正在使用 mongoose。我在下面的代码中检测到对我没有意义的 insertMany 模式

  ItemsModel.find({}, function(err, toDoListDb) {
  if (err) {
    console.log("error reading items");
  } else {
    console.log("the DB length is " + toDoListDb.length);
    if (toDoListDb.length === 0) {
      ItemsModel.insertMany(defaultItems, function(err) {
        if (err) {
          console.log("Error while inserting default items");
        } else {
          console.log("default items insertion successful");
        }
      });
      console.log("entered default items and redirect");

      res.redirect("/");
    } else {
      console.log("read from DB successful");
      res.render("list", {
        listTitle: day,
        newListItems: toDoListDb
      });
    }
  };
});

如果我第一次在运行应用程序时点击 localhost 并且数据库为空,则我有一个数组(在此代码之外),其中包含要写入数据库的“默认项”列表。我检查数据库集合的长度,如果是0,则默认项写入数据库。如果数据库已经有一些文档,它会将它传递给一个 ejs 模板并呈现它。

我有 console.logs 来分析当数据库最初为空时会发生什么。如果数据库绝对是空的 - 内部没有定义集合。然后,由于某种原因,代码需要多次尝试写入数据库。在最后一次尝试中,当数据库写入实际成功时,我实际上按顺序获得了控制台日志:“默认项目插入成功”和“插入默认项目时出错”。这没有任何意义。

我正在通过在 mongoDB 控制台上执行 dropDatabase() 后运行应用程序来测试这一点。如果不是 dropDatabase,我只是删除集合中的文档,但在 DB 中保留空集合,则默认项的 insertMany 将按预期工作。

所以我的问题是,有没有办法了解 insertMany 内部发生的事情并对后端发生的事情充满信心。因为我在这里看到几个关于 insertMany 没有按预期插入项目的问题。

PS:渲染的最终输出是正确的。我只是不清楚数据库写入是如何执行的。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    我想说大多数问题是由于人们误解了 node 的工作原理,特别是异步编程、回调、promise 和 async/await。结果是当人们期望一个插入或同时执行操作时他们认为他们正在编写顺序代码等时插入多次。

    我的建议是仔细遵循官方文档。问题不太可能出在驱动程序或数据库中。

    【讨论】:

    • 谢谢。我认为其中很多是关于这些天如何学习编程的。安装这个。输入这个。我肯定会因为跳过文档而直接跳入代码而感到内疚。
    猜你喜欢
    • 2018-03-07
    • 2022-12-04
    • 2022-01-08
    • 2015-07-19
    • 2021-12-04
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多