Node.js $unset在猫鼬中不起作用

Node.js $unset在猫鼬中不起作用,node.js,mongodb,mongoose,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(er

我的模式如下:-

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

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

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

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

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

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

这对我来说很有效

doc.field = undefined
await doc.save()

仅供参考,在我下面的回答中,我假设Schema1指向模式模型,而不是模式本身。是的,我使用简单的名称来理解。但我必须从我的收藏和所有文档中删除version字段。简单的回答是代码正在这样做。但是,如果您使用mongoose而不更新模式,它将继续返回带有空数组的version属性。因此,如果我将其从模式中删除,它将从现有文档中删除version字段。我认为它对新文档有效。但我想从现有文档中删除它。它有效。谢谢。