$ unset在mongoose中不起作用

Kun*_*ndu 2 mongoose mongodb node.js

我的架构如下: -

var Schema1 = new mongoose.Schema({
  name: String,
  description: String,
  version: [{
    id: String,
    status: Number
 }]
});
Run Code Online (Sandbox Code Playgroud)

我想取消设置版本字段.我尝试以下代码: -

Schema1.update({}, {
 $unset: {
  version: 1
  }
 }, {
 multi: true
}).exec(function(err, count) {
 console.log(err, count)
});
Run Code Online (Sandbox Code Playgroud)

它给了我以下输出: -

null 10
Run Code Online (Sandbox Code Playgroud)

但输出包含版本字段: -

{
  name : 'a',
  description : 'sdmhf',
  version : []
}
Run Code Online (Sandbox Code Playgroud)

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

C B*_*ard 7

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

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

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

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