使用Mongoose从MongoDB文档中删除密钥

Dan*_*ley 83 mongoose mongodb node.js document-database

我正在使用Mongoose Library通过node.js访问MongoDB

有没有办法从文档中删除密钥?即不只是将值设置为null,但删除它?

User.findOne({}, function(err, user){
  //correctly sets the key to null... but it's still present in the document
  user.key_to_delete = null;

  // doesn't seem to have any effect
  delete user.key_to_delete;

  user.save();
});
Run Code Online (Sandbox Code Playgroud)

sta*_*er2 141

在早期版本中,您需要删除node-mongodb-native驱动程序.每个模型都有一个集合对象,其中包含node-mongodb-native提供的所有方法.因此,您可以通过以下方式执行相关操作:

User.collection.update({_id: user._id}, {$unset: {field: 1 }});
Run Code Online (Sandbox Code Playgroud)

从版本2.0开始,您可以:

User.update({_id: user._id}, {$unset: {field: 1 }}, callback);
Run Code Online (Sandbox Code Playgroud)

从版本2.4开始,如果您已经拥有模型实例,则可以执行以下操作:

doc.field = undefined;
doc.save(callback);
Run Code Online (Sandbox Code Playgroud)

  • @evilcelery`doc.set('field',undefined)`可能还不够,因为严格模式(默认)不允许设置不再存在于模式中的字段.`doc.set('field',undefined,{strict:false})`运行正常. (25认同)
  • 请注意,如果您尝试删除模式中不再定义的旧属性,则需要执行`doc.set('field',undefined)` (21认同)
  • 使用`User.update({_ id:id},{$ unset:{field:1}},callback)`或者如果你有一个文档实例,将路径设置为undefined然后保存它:`doc.field =不确定的; doc.save()` (4认同)
  • 删除`doc.field.foo`怎么样? (3认同)

小智 45

你会想要这样做:

User.findOne({}, function(err, user){
  user.key_to_delete = undefined;
  user.save();
});
Run Code Online (Sandbox Code Playgroud)

  • 从版本2.4.0开始,将文档密钥设置为undefined会将$ unset传递给mongodb http://aaronheckmann.posterous.com/mongoose-240 (20认同)
  • 这只会将其设置为null - 而不是OP所要求的. (3认同)

Nou*_*had 26

我使用mongoose并使用上述任何功能都符合我的要求.该函数编译无错误,但该字段仍将保留.

user.set('key_to_delete', undefined, {strict: false} );
Run Code Online (Sandbox Code Playgroud)

为我做了诀窍.


And*_*ich 6

在mongo语法中删除一些密钥,您需要执行以下操作:

{ $unset : { field : 1} }
Run Code Online (Sandbox Code Playgroud)

似乎在Mongoose也一样.

编辑

检查示例.