使用mongoose从mongodb集合中的文档数组中删除对象

时间:2018-07-01 21:39:11

标签: javascript node.js mongodb mongoose

我尝试从对象的数组属性中删除一个元素。 这是我的架构:

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

我不明白为什么它不好:/

2 个答案:

答案 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);
          }
       );