从嵌入式MongoDB文档中的数组中提取对象



我一直无法找到一种从嵌入式mongoDB文档中的数组中删除对象的方法。 我的架构包含一个用户和一个花对象列表。它看起来像这样:

const UserSchema = new Schema({
name    : {
type     : String,
required : true
},
flowers : [
{
name       : {
type     : String,
required : true
},
water_freq : {
type     : Number,
required : true
}
}
]
});

我设法添加了这样的花对象:

router.post('/:id/flowers/add', (req, res) => {
const { name, water_freq } = req.body;
User.findByIdAndUpdate(
req.params.id,
{
$push : {
flowers : { name, water_freq }
}
},
{ new: true }
).then((user) => res.json(user));
});

我想通过用户的ID从用户中删除鲜花,但我无法让它工作。 下面的代码是我的非工作尝试。

router.delete('/:id/flowers/delete/:flowerid', (req, res) => {
User.findByIdAndUpdate(req.params.id, {
$pull : {
flowers : { _id: req.params.flowerid }
}
}).then((user) => res.json(user));
});

如果有人能帮助我做到这一点,我将不胜感激。

一个可能的原因是,在您的查询{$pul: xxxx}中,MongoDB期望为每个花条目自动生成一个BSON类型的对象ID,而您正在给出一个字符串。因此,您可能希望在执行查询之前将其转换为正确的类型:

尝试:

router.delete('/:id/flowers/delete/:flowerid', (req, res) => {
User.findByIdAndUpdate(req.params.id, {
$pull : {
flowers : { _id: ObjectId(req.params.flowerid) }
}
}).then((user) => res.json(user)); });

查看有关对象 ID 的更多信息

感谢您的回复! 我和邮递员做了更多的测试,发现事实上我在问题中发布的代码确实有效。让我感到不安的是,带有用户文档的响应仍然显示我刚刚删除的花朵,这让我觉得它不起作用。

我仍然不知道为什么会这样,或者是否有办法获得更新用户的响应。但删除似乎按预期工作。

最新更新