我的架构如下:-
var Schema1 = new mongoose.Schema({
name: String,
description: String,
version: [{
id: String,
status: Number
}]
});
我想取消设置版本字段。我尝试以下代码:-
Schema1.update({}, {
$unset: {
version: 1
}
}, {
multi: true
}).exec(function(err, count) {
console.log(err, count)
});
它给了我以下输出:-
null 10
但是输出包含版本字段:-
{
name : 'a',
description : 'sdmhf',
version : []
}
上面的代码删除了数据,但我也想从我的集合中删除版本字段。你能告诉我该怎么做吗?
您的代码没有任何问题。 Mongoose 实际上正在删除文档中的这些字段(我认为这是您所期望的)。您可以通过在数据库中打开 mongo shell 并搜索更新前后的所有文档来查看(使用
db.yourcollection.find({})
)
为什么即使从集合中的每个文档中删除空数组,仍然会出现? Mongoose 将确保返回的文档遵循您定义的架构。因此,即使 Mongoose 在实际文档中没有找到指向数组的
version
属性,当返回匹配的文档时,它仍然会呈现一个空数组。
您可以通过向架构中添加一些任意属性(指向数组)并再次运行
.find({})
来自行验证这一点。您将看到 Mongoose 将在每个文档中返回这些属性,即使您从未将它们保存到数据库中。同样,如果您添加非数组属性,如字符串、布尔值等,只要您指定默认值,Mongoose 就会返回这些属性。
如果您想永久删除
version
(正如您在评论中提到的),您可以在完成 $unset 后将其从 Mongoose 模式中删除。
这对我有用
doc.field = undefined
await doc.save()
我也有同样的问题。 结果我忘记等待更新操作。所以,我的猫鼬在操作之前就与数据库断开了连接。
这解决了我的问题
await Schema1.update({}, {
$unset: {
version: 1
}
}, {
multi: true
}).exec(function(err, count) {
console.log(err, count)
});
别忘了等待