$unset 在猫鼬中不起作用

问题描述 投票:0回答:3

我的架构如下:-

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

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

node.js mongodb mongoose
3个回答
10
投票

您的代码没有任何问题。 Mongoose 实际上正在删除文档中的这些字段(我认为这是您所期望的)。您可以通过在数据库中打开 mongo shell 并搜索更新前后的所有文档来查看(使用

db.yourcollection.find({})

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

version
属性,当返回匹配的文档时,它仍然会呈现一个空数组。

您可以通过向架构中添加一些任意属性(指向数组)并再次运行

.find({})
来自行验证这一点。您将看到 Mongoose 将在每个文档中返回这些属性,即使您从未将它们保存到数据库中。同样,如果您添加非数组属性,如字符串、布尔值等,只要您指定默认值,Mongoose 就会返回这些属性。

如果您想永久删除

version
(正如您在评论中提到的),您可以在完成 $unset 后将其从 Mongoose 模式中删除。


2
投票

这对我有用

doc.field = undefined
await doc.save()

0
投票

我也有同样的问题。 结果我忘记等待更新操作。所以,我的猫鼬在操作之前就与数据库断开了连接。

这解决了我的问题

await Schema1.update({}, {
 $unset: {
  version: 1
  }
 }, {
 multi: true
}).exec(function(err, count) {
 console.log(err, count)
});

别忘了等待

© www.soinside.com 2019 - 2024. All rights reserved.