javascript - Mongoose - 删除子文档数组项

标签 javascript node.js mongodb mongoose mongodb-query

我有这个供用户使用的小架构:

{
 username: String,
 contacts: Array
}

例如,某些用户的联系人将如下所示:

{
 username: "user",
 contacts: [{'id': ObjectId('525.....etc'), 'approved': false}, {'id':ObjectId('534.....etc'), 'approved': true}]
}

现在我需要从联系人中删除一个项目,所以我这样做:

model.findByIdAndUpdate(23, {'$pull': {
              'contacts':{'id':'525.....etc'}
              }});

但似乎不起作用,没有错误,但它没有被删除,我只想将这个文档返回给用户:

{
     username: "user",
     contacts: [{'id':ObjectId('534.....etc'), 'approved': false}]
    }

如何做到这一点?

最佳答案

$pull运算符实际上只是对它正在操作的数组元素执行条件。看来您的问题实际上可能并未表明您可能正在使用 mongoose 默认为所有数组字段创建的 ObjectId 值。

所以你可以这样查询,在导入 ObjectId 创建方法之后:

model.findByIdAndUpdate(23, {
    '$pull': {
        'contacts':{ '_id': new ObjectId(someStringValue) }
    }
});

或者实际上你可以更好地定义你的“模式”, Mongoose 实际上会根据模式中定义的“类型”为你“自动转换”ObjectId:

var contactSchema = new Schema({
    approved: Boolean
});

var userSchema = new Schema({
    username: String,
    contacts: [contactSchema]
});

这允许 mongoose 为严格类型的字段定义“遵循规则”。所以现在它知道您实际上有一个 _id 字段用于联系人数组的每个元素,并且该字段的“类型”实际上是一个 ObjectId 所以它会自动重新转换作为 true ObjectId 提供的“String”值。

关于javascript - Mongoose - 删除子文档数组项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26252569/

相关文章:

node.js - 当我发出邮寄请求时, postman 挂起。发布请求 注册工作正常,但登录不行

javascript - 在现有集合(mongodb)的所有文档中添加一个字段?

node.js - 如何在 Node.js 中正确使用 Mongoose 模型?

javascript - Python/Flask 与 Javascript 的通信

node.js - 为什么 momentjs-node 无法识别该时间字符串?

javascript - 类型错误 : Cannot set property 'xxx' of undefined

javascript - 为什么这个 promise 没有得到解决?

javascript - 加载 jQuery 之前运行的增强.js 库 onScriptLoaded

javascript - 存储 jQuery 插件初始化设置以供后续初始化?

javascript - 使用 Raphael js 拖放