如何使用Mongoose实现批量数据存在即更新、不存在则插入的操作
问题原因
- 字段映射不匹配:你的Schema中分类字段为
category,但传入的vehicle对象分类字段为name,你直接$set: vehicle会导致文档缺少必填的category字段,要么插入校验失败,要么后续过滤时无法匹配到已有文档。 - 操作符使用不符合需求:如果你的目标是全文档替换,使用
$set是错误的,$set只会更新你传入的字段,不会删除原有文档的冗余字段;如果是只想更新vehicles数组,你没有明确指定更新字段,可能出现字段覆盖异常。 - 过滤逻辑和更新逻辑不对应:你按
category: vehicle.name过滤,但更新时没有将name映射为category存储,新插入的文档不存在category字段,下次更新时依然匹配不到,会出现重复插入的问题。
修复方案
方案1:全文档替换(符合“相同category存在则替换更新”的需求)
function insertVehicles(vehicles) { const vehicleUpdate = vehicles.map(vehicle => ({ updateOne: { filter: { category: vehicle.name }, // 直接传入符合Schema结构的完整文档,实现全量替换 update: { category: vehicle.name, vehicles: vehicle.vehicles }, upsert: true } })); return Vehicle.bulkWrite(vehicleUpdate); }
方案2:仅更新vehicles数组(保留文档其他已有字段)
function insertVehicles(vehicles) { const vehicleUpdate = vehicles.map(vehicle => ({ updateOne: { filter: { category: vehicle.name }, // 仅指定更新vehicles字段 update: { $set: { vehicles: vehicle.vehicles } }, upsert: true } })); return Vehicle.bulkWrite(vehicleUpdate); }
内容的提问来源于stack exchange,提问作者Gigity1999
相关产品推荐
相关产品推荐

