为什么 updateMany 在我的 MongoDB / Mongoose 项目中不起作用?

问题描述 投票:0回答:1

我用一些书籍和一些作者制作了一个简单的数据库。现在我想用新信息更新作者对象。但数据库中什么也没发生。

作者目前在 Postman 中看起来像这样:

[
    {
        "_id": "663b3c44bcc58cb02031ae33",
        "name": "JRR Tolkien",
        "__v": 0
    },
    {
        "_id": "663b3c44bcc58cb02031ae33",
        "name": "JK Rowling",
        "__v": 0
    }
]

我想向其中每一个添加行:“country”:“UK”,所以我创建了这个端点:

app.post("/add-info", (req, res) => {
  try {
    Author.updateMany(
      {},
      {
        $set: {
          country: "UK"
        },
      }
    )

    res.status(201).json({ message: "Info added successfully" })
  } catch (err) {
    res.status(500).json({ error: "Failed to add info" })
  }
})

使用端点发送后请求时,我收到“信息添加成功”消息。所以没有什么问题。然而,数据库中的作者看起来仍然是一样的。没有更新任何内容!怎么了?

更新: 我尝试过处理这样的异步事件:

app.post("/add-info", async (req, res) => {
  try {
  
    const result = await Author.updateMany({}, { $set: { country: "UK" } })

    res.status(200).json({ message: "Info added successfully", result })
  } catch (err) {
    res.status(500).json({ error: "Failed to add info", details: err.message })
  }
})

结果是:

{
    "message": "Info added successfully",
    "result": {
        "acknowledged": false
    }
}

数据库中没有任何更新。

我也尝试过。然后像这样:

app.post("/add-info", (req, res) => {

  Author.updateMany({}, { $set: { country: "UK" } })
    .then((result) => {
      console.log("Update result:", result)
      console.log(`${result.nModified} users updated`)
    })
    .catch((error) => {
      console.error("Error updating users:", error)
    })
  
})

结果如下:

Update result: { acknowledged: false } undefined users updated
mongodb mongoose
1个回答
0
投票

mongoose

Model.updateMany
方法与 mongodb node.js 驱动程序的
collection.updateMany
不一样。

Mongoose 尝试抽象掉一些样板文件,这样当你调用

Model.updateMany
时,你就不需要使用
$set
,这是隐含的,并且作为第二个参数传递的更新对象在提交之前根据模式进行验证对数据库的操作。

在您的示例中,更新部分

    {
        $set: {
          country: "UK"
    }

指示 mongoose 将字段

$set
的值设置为对象
country:"UK"
。 我假设 Author 模型的架构不包含名为
$set
的字段,因此当根据架构验证此更新时,未定义的字段将被删除,留下
{}
,并且 mongoose 会跳过向数据库。

实现你想要的:

  • 确保架构中存在“国家/地区”字段
  • 仅将第二个参数中要修改的字段传递给 updateMany

我做了一个 updateMany 的快速示例:

const mongoose = require("mongoose")

demoModel = mongoose.model(
   "Demo",
    new mongoose.Schema({
        time: {type: Date, required: true},
        updated: {type: Boolean, required:false}
    }),
)

async function main() {
    console.log("in main");
    mongoose.connect("mongodb://localhost:27017/test");
    console.log("connected lazily");

    let now = new Date();
    await demoModel.create({time: new Date()});
    await demoModel.create({time: new Date()});
    let iresult = await demoModel.find();
    console.log("Insert result:",iresult);

    let result = await demoModel.updateMany({},{updated:true});
    console.log("Update Result:",result)

    let after = await demoModel.find();
    console.log("Find result:",after);

    process.exit();
}

main();

这导致了以下输出:

in main
connected lazily
Insert result: [
  {
    _id: new ObjectId("66e0d9ed85544caa04f615c1"),
    time: 2024-09-10T23:44:45.091Z,
    __v: 0
  },
  {
    _id: new ObjectId("66e0d9ed85544caa04f615c4"),
    time: 2024-09-10T23:44:45.191Z,
    __v: 0
  }
]
Update Result: {
  acknowledged: true,
  modifiedCount: 2,
  upsertedId: null,
  upsertedCount: 0,
  matchedCount: 2
}
Find result: [
  {
    _id: new ObjectId("66e0d9ed85544caa04f615c1"),
    time: 2024-09-10T23:44:45.091Z,
    __v: 0,
    updated: true
  },
  {
    _id: new ObjectId("66e0d9ed85544caa04f615c4"),
    time: 2024-09-10T23:44:45.191Z,
    __v: 0,
    updated: true
  }
]
© www.soinside.com 2019 - 2024. All rights reserved.