猫鼬-搜索复杂的嵌套文档并更新子文档的某些字段

时间:2019-04-11 00:01:22

标签: javascript node.js mongodb mongoose

我正在尝试根据邮递员req.body提供的密钥更新猫鼬子文档的某些字段。

我尝试了一些解决方案,但没有成功。我想遍历req.body并更新必要的字段。就像我在“ //更新功能”下尝试过的

这是我的模式。

    _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
        })
    }
});

这是我的邮递员的值

[
    {"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 个答案:

答案 0 :(得分:0)

鉴于您作为后期请求发送的数据,您传递给[Activity(Label = "MyApp", Icon = "@mipmap/icon", Theme = "@style/MainTheme", ScreenOrientation = ScreenOrientation.Portrait, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation, NoHistory = false)] public class MainActivity : FormsAppCompatActivity { //... } 的对象看起来像这样:

$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