Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Mongoose从MongoDB文档中删除密钥_Mongodb_Node.js_Mongoose_Document Database - Fatal编程技术网

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

使用Mongoose从MongoDB文档中删除密钥,mongodb,node.js,mongoose,document-database,Mongodb,Node.js,Mongoose,Document Database,我正在使用该库通过node.js访问MongoDB 是否有方法从文档中删除密钥?i、 不只是将值设置为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 del

我正在使用该库通过node.js访问MongoDB

是否有方法从文档中删除密钥?i、 不只是将值设置为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();
});

在mongo语法中,要删除某些键,需要执行以下操作:

{ $unset : { field : 1} }
看来猫鼬也是这样

编辑


检查示例。

这可能是像使用

function (user)
而不是

function(err, user)

为find的回拨做准备?我只是想帮你,因为我已经有了这个案子。

你会想这样做的:

User.findOne({}, function(err, user){
  user.key_to_delete = undefined;
  user.save();
});

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

User.collection.update({_id: user._id}, {$unset: {field: 1 }});
从2.0版开始,您可以执行以下操作:

User.update({_id: user._id}, {$unset: {field: 1 }}, callback);
doc.field = undefined;
doc.save(callback);
从版本2.4开始,如果您已经有模型的实例,则可以执行以下操作:

User.update({_id: user._id}, {$unset: {field: 1 }}, callback);
doc.field = undefined;
doc.save(callback);

我使用mongoose,使用上述任何一个函数都满足了我的要求。函数编译时无错误,但字段仍将保留

user.set('key_to_delete', undefined, {strict: false} );
你帮我做了这个把戏。

你可以用
删除用户。_doc.key

Mongoose文档不是一个普通的javascript对象,这就是为什么不能使用delete操作符(或从“lodash”库中取消设置

您可以选择设置doc.path=null | | undefined,或者使用Document.toObject()方法将mongoose doc转换为普通对象,然后像往常一样使用它。 请阅读mongoose api参考中的更多内容:

示例如下所示:

User.findById(id, function(err, user) {
    if (err) return next(err);
    let userObject = user.toObject();
    // userObject is plain object
});

所有这些答案的问题在于,它们只适用于一个领域。例如,假设我希望删除文档中的所有字段,如果它们是空字符串
“”
。 首先,您应该检查字段是否为空字符串并将其放入
$unset

function unsetEmptyFields(updateData) {
  const $unset = {};
  Object.keys(updatedData).forEach((key) => {
    if (!updatedData[key]) {
      $unset[key] = 1;
      delete updatedData[key];
    }
  });
  updatedData.$unset = $unset;

  if (isEmpty(updatedData.$unset)) { delete updatedData.$unset; }

  return updatedData;
}

function updateUserModel(data){
const updatedData = UnsetEmptyFiled(data);

    const Id = "";
    User.findOneAndUpdate(
      { _id: Id },
      updatedData, { new: true },
    );
}


如果要从集合中删除密钥,请尝试此方法

 db.getCollection('myDatabaseTestCollectionName').update({"FieldToDelete": {$exists: true}}, {$unset:{"FieldToDelete":1}}, false, true);
尝试:


你能澄清这个答案并给出一个与上述示例代码相关的代码示例吗?对不起,我在mongoose没有经验。上面的语法是mongo语法,所以我认为任何语言的驱动程序都支持这种语法。我找到了一些示例,请在我的答案中检查它。这只会将它设置为null-而不是OP所要求的。从2.4.0版开始,将文档键设置为undefined将把$unset传递给mongodb,我认为我已经找到了,但经过一些测试:可能没有。不过,这在这个话题上有一些很好的讨论。哈哈,没关系,我猜这是你的帖子!这在Mongoose 2.X中已经修复,因此您可以不使用集合。或者使用
User.update({u id:id},{$unset:{field:1},callback)
或者如果您有一个文档实例,将路径设置为undefined,然后保存它:
doc.field=undefined;doc.save()不允许设置不再在架构中的字段
doc.set('field',undefined,{strict:false})
效果很好。投票给这个有用的答案,太糟糕了@alexander link在2015年没有给出答案()谢谢你的回答,对我来说,其他解决方案对嵌套在数组中的对象不起作用@本索这也是我的情况。只有这个解决方案工作得很好,因为在找到特定文档的ID后,我必须删除带有数组的字段。请注意,字符串是键的路径。因此,如果要删除的对象是嵌套的,则必须指定其路径。这个答案解决了我的问题!