Mongoose — поиск в сложном вложенном документе и обновление некоторых полей вложенного документа

#javascript #node.js #mongodb #mongoose

#javascript #node.js #mongodb #mongoose

Вопрос:

Я пытаюсь обновить некоторые поля вложенного документа mongoose в соответствии с предоставленными ключами из postman req.body.

Я попробовал несколько решений, но безуспешно. Я хотел бы просмотреть req.body и обновить необходимые поля. как я уже пробовал в «// update function»

Вот моя схема.

     _id: mongoose.Schema.Types.ObjectId,
    profile: {
        full_name: {
            first_name: String,
            last_name: String
        },
        phone: Number,
        email: String,
        gender: String,
        address: {
            city: String,
            street: String,
        },
        occupation: String,
        biography: String
    },
    password: {
        type: String,
        required: true
    },
}, {
    timestamps: {
        createdAt: 'created_at'
    }
})
module.exports = mongoose.model('Assistant', assistantSchema);
  

Вот мой маршрут обновления, в котором я хотел бы обновить значения

 router.patch('/:assistantId', Check_Auth, async (req, res, next) => {
    const id = req.params.assistantId;

//update function
    const updateParams = req.body;
    const set = {};
    for (const field of updateParams) {
        set['assistant.$.'   field.key] = field.value
    }

//update
    try {
        await Assistant.updateOne({
            _id: id
        }, {
            $set: set
        }).exec().then(result => {
            console.log(result);
            res.status(201).json(result)
        }).catch(err => {
            console.log(err);
            res.status(403).json({
                errmsg: "Ooh something happen, Not able to update profile try again"
            })
        })
    } catch (err) {
        res.status(500).json({
            errmsg: err
        })
    }
});
  

Вот мои значения из postman

 [
    {"key": "phone", "value": "651788661"},
    {"key": "email", "value": "dasimathias@gmail.com"},
    {"key": "city", "value": "douala"},
    {"key": "street", "value": "bonaberi"},
    {"key": "biography", "value": "just share a little code"}
]
```
  

Ответ №1:

Учитывая данные, которые вы отправляете в качестве post-запроса, передаваемый объект $set выглядит следующим образом :

 { 'assistant.$.phone': '651788661',
  'assistant.$.email': 'dasimathias@gmail.com',
  'assistant.$.city': 'douala',
  'assistant.$.street': 'bonaberi',
  'assistant.$.biography': 'just share a little code' }
  

Это несовместимо с вашей схемой, если вы пытаетесь обновить profile атрибут, вы должны сделать это :

 for (const field of updateParams) {
  if(field.key == "city") set[`profile.address.${field.key}`] = field.value
  else set[`profile.${field.key}`] = field.value
}
  

Что дает такой объект set :

 { 'profile.phone': '651788661',
  'profile.email': 'dasimathias@gmail.com',
  'profile.address.city': 'douala',
  'profile.street': 'bonaberi',
  'profile.biography': 'just share a little code' 
}
  

Обратите внимание, что city вложенный внутри address , поэтому вам нужно получить к нему доступ, вам нужно будет сделать то же самое (условие) для full_name .
Если вы обновляете массив вложенных документов:

 set[`assistant.$.profile.address.${field.key}`]
set[`assistant.$.profile.${field.key}`]