簡體   English   中英

Mongoose 更新嵌套子文檔

[英]Mongoose updating nested subdocuments

我正在嘗試使用request.body更新子文檔 mongoose 而不傳遞子文檔_id 更新有效,但 mongoose 正在從子文檔中刪除_id

假設以下模式

// schemas.js
const mongoose = require('mongoose');

const motorSchema = new mongoose.Schema({
    type: String,
    volume: Number,
});

const carSchema = new mongoose.Schema({
    manufacturer: String,
    model: String,
    motors: [motorSchema],
});

const userSchema = new mongoose.Schema({
   username: String,
   email: String,
   cars: [carSchema]
});
const mongoose = require('mongoose');
// import schemas
const userSchema = require('userSchema');
const carSchema = require('carSchema');
const motorSchema = require('motorSchema');
// create models
const User = mongoose.model("User", userSchema);
const Car = mongoose.model("Car", carSchema);
const Motor = mongoose.model("Motor", motorSchema);

module.exports.updateCar = async function (request, response) {
    const condition = {
        _id: new mongoose.Types.ObjectId(request.body.userId),
        "cars._id": new mongoose.Types.ObjectIt(request.body.carId)
        };

    // Build object for partial update
    const set = {};
    for(let field in reqest.body){
        set[`cars.$.${field}`] = request.body[field];
    }

    const update = {
        $set = set;
    }

    User.findOneAndUpdate(condition, update, {new: true, overwrite: false},
        (error, user) => {
            if(error) {response.send(error)}
            response.json(user);
        }
}

問題是我所有的_id屬性都將在 motors 數組中被覆蓋。 如何強制 mongoose 默認不更改_id屬性?

如果我理解正確,等效的 mongoDB 語法將使用arrayFilters ,因此您也可以修改查詢以使用它:

例如:

User.findOneAndUpdate(
  condition,
  {$set: {"cars.$[item].size": "large"}},
  {arrayFilters: [{"item._id": new mongoose.Types.ObjectIt(request.body.carId)}]}
)

playground 示例中查看它是如何工作的

根據此方法,您的代碼需要選項部分中的arrayFilters和查詢的$set部分中的$[<identifier>]

const set = {};
    for(let field in reqest.body){
        set[`cars.$[item].${field}`] = request.body[field];
    }

    const update = {
        $set = set;
    }

    User.findOneAndUpdate(
        condition, 
        update, 
        {
            arrayFilters: [{"item._id": new mongoose.Types.ObjectIt(request.body.carId)}],
            new: true, overwrite: false
        },
        (error, user) => {
            if(error) {response.send(error)}
            response.json(user);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM