$ unset在mongoose中不起作用

时间:2014-05-28 10:30:40

标签: node.js mongodb mongoose

我的架构如下: -

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 : []
}

上面的代码删除了数据但我想从我的集合中删除版本字段。你能告诉我怎么做吗?

2 个答案:

答案 0 :(得分:7)

您的代码没有任何问题。 Mongoose实际上删除了文档中的那些字段(我假设是你所期望的)。您可以通过在数据库中打开mongo shell并在更新之前和之后搜索所有文档来查看(使用db.yourcollection.find({})

为什么即使从集合中的每个文档中删除一个空数组,它仍然会出现? Mongoose将确保返回的文档将遵循您定义的架构。因此,即使Mongoose在实际文档中没有找到指向数组的version属性,当返回匹配的文档时,它仍然会显示一个空数组。

您可以通过向架构添加一些任意属性(指向数组)并再次运行.find({})来自行验证。您将看到Mongoose将在每个文档中返回这些属性,即使您从未将它们保存到数据库中。同样,如果你添加像字符串,布尔值等非数组属性,只要你指定一个默认值,Mongoose就会返回它们。

如果你想永久删除version(正如你在评论中提到的那样),你可以在完成$ unset后从Mongoose模式中删除它。

答案 1 :(得分:0)

这对我有用

doc.field = undefined
await doc.save()