我尝试从对象的数组属性中删除一个元素。 这是我的架构:
const userSchema = new mongoose.Schema({
userID: {
type: Number
},
name: {
type: String
},
names: [
{
text: { type: String, required: true },
order: {
type: Number,
required: true
}
}
]
});
这是我的猫鼬功能:
User.findOne({ userID: Number(req.params.id) })
.then((user) => {
user.names.remove({text: "john", order: 3});
recipe.save(() => {
res.json(recipe);
});
})
我不明白为什么它不好:/
答案 0 :(得分:0)
要从文档中的数组中删除元素,请按照以下步骤操作
User.update(
{
userID: Number(req.params.id),
},
{
$pull: { names: { $elemMatch: { text: "john", order: 3 } } }
},
{
multi: false
}
).lean().then((Status) => {
console.log("Status-->", Status);
res.json('Removed Successfully');
})
在link处引用$ pull运算符
答案 1 :(得分:0)
根据猫鼬remove method的文档,仅当传递回调时才执行删除操作。要强制执行而没有回调,必须首先调用remove()
,然后使用exec()
方法执行它。
由于您尝试从对象数组中删除,因此最好使用pull运算符。您无需查找和删除,只需使用更新方法即可。
根据$pull operator的文档,您可以指定值或条件
即
{ $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }
在您的方案中,您需要指定一个或多个名称项目对象的完整值,或者指定与一个或多个名称项目
匹配的条件添加条件以匹配名称项的ID,或者如果您不知道该条件,则可以使用elemMatch在少数字段上进行匹配,即
使用以下拉动条件解决此问题:
User.update(
{ _id: Number(req.params.id) },
{ $pull: { 'names': { $elemMatch: { 'text': "john", 'order': 3 }} } },
(error, success) => {
if (error) console.log(error);
console.log(success);
}
);