我有一个使用MongoDB 7.0.5社区、Mongoose 7.6.8、MongoDB驱动程序6.3.0和Node版本20.10.0的 node 应用程序.

我无法使此代码工作:

const updatedDealer = await my_model.updateMany(
  {
    CustomerId: 123,
    'Vehicles.Id': { $in: IdArray }
  },
  {
    $set: { 'Vehicles.$.FieldsToUpdate': true }
  },
  {
    multi: true
  }
);

从字面上看,Id数组是一个数字array.我的Mongoose模型是正确的,因为如果我使用以下命令更新单个记录:

const updatedDealer = await my_model.findOneAndUpdate(
  {
     CustomerId: 123,
     'Vehicles.Id': 123456
  },
  {
    $set: { 'Vehicles.$.FieldsToUpdate': true }
  },
  {
    new: true 
  }
);

它起作用了. 下一个CustomerID或Vehicles.ID是MongoDB_ID.

这是我的数据的简化示例:

[{
CustomerId: 123,
CustomerName: 'Some Company',
Vehicles: [
    {
        Id: 123456,
        Make: 'Ford',
        Model: 'Focus',
        FieldsToUpdate: false
    },
    {
        Id: 543213,
        Make: 'Kia',
        Model: 'EV9',
        FieldsToUpdate: false
    }
]
}]

下面是我的模型的一个简化示例:

const my_model = mongoose.Schema({
CustomerId: {
    type: Number
},
CustomerName: {
    type: String
},
Vehicles: [
    {
        Id: {
            type: Number
        },
        Make: {
            type: String
        },
        Model: {
            type: String
        },
        FieldsToUpdate: {
            type: Boolean
        }
    }
]
})

希望你能帮忙.谢谢.

推荐答案

Mongoose V7没有Model.update()方法,它是removed in V7.

您可以使用Model.updateMany(),如下所示:

const updatedDealer = await my_model.updateMany({
        CustomerId: 123,
        "Vehicles.Id": { $in: IdArray }
    },
    {
        $set: {
            "Vehicles.$[var].FieldsToUpdate": true
        }
    },
    {
        arrayFilters: [
            {
                "var.Id": {
                    $in: IdArray
                }
            }
        ]
    }
);

这在$set阶段中通过在元素的位置插入变量名[var]来使用filtered positional operator $[<identifier>],从而可以在arrayFilters中使用它来识别该数组元素,并且仅当满足$in条件时才进行更新.

Node.js相关问答推荐

如何解决无法获得本地颁发者证书的问题

CloudTasksClient在Firebase Function % s onDocumentCreated中实例化时导致错误

Twilio-获取呼叫录音不起作用的请求

如何使用NodeJS处理来自请求的单个或多个文件?

无法从MongoDB文档中保存的对象数组中获取对象的属性

在内存中加载安全密钥安全吗?还是每次都从文件中读取?

几个 lambda 共有的函数

在构建完成后,将AddedFiles文件夹的内容复制到dist文件夹

为什么我的 Cypress Post 请求的请求正文是空的?

如何为单个 mongo nodejs 驱动程序找到最佳连接池大小

将 express js app.use() 移动到另一个文件

在 node:readline 中按 CTRL+D 时会发出什么信号?

如何解决'npm应该在 node repl之外运行,在你的普通shell中'

安装 node 包时可以使用自定义目录名称而不是node_modules吗?

什么是 JavaScript 中的REPL?

从 React(同构应用程序)进行 API 调用时出现Access-Control-Allow-Origin问题

如何判断MongoDB本机nodejs驱动程序中是否存在集合?

使用 Mongoose 进行多对多映射

Mongoose:模式与模型?

FireStore 如果不存在则创建一个文档