145

我正在使用Mongoose库通过 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();
});
4

11 回答 11

213

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

User.collection.update({_id: user._id}, {$unset: {field: 1 }});

从 2.0 版开始,您可以执行以下操作:

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

从 2.4 版开始,如果你已经有一个模型实例,你可以这样做:

doc.field = undefined;
doc.save(callback);
于 2011-08-04T09:06:43.370 回答
66

你会想要这样做:

User.findOne({}, function(err, user){
  user.key_to_delete = undefined;
  user.save();
});
于 2011-05-09T02:52:41.410 回答
41

我使用猫鼬并使用上述任何功能满足了我的要求。该函数编译无错误,但该字段仍将保留。

user.set('key_to_delete', undefined, {strict: false} );

为我做了伎俩。

于 2016-09-28T11:30:14.827 回答
10

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

{ $unset : { field : 1} }

似乎在猫鼬一样。

编辑

检查这个例子。

于 2010-12-20T09:02:24.113 回答
1

这可能是一个附带问题,例如使用

function (user)

代替

function(err, user)

对于查找的回调?只是想帮助解决这个问题,因为我已经有了这个案例。

于 2011-04-12T20:46:02.057 回答
1

Mongoose 文档不是一个普通的 javascript 对象,这就是为什么你不能使用 delete 运算符。(或unset来自'lodash'库)。

您的选择是设置 doc.path = null || 未定义或使用 Document.toObject() 方法将猫鼬文档转换为普通对象,然后像往常一样使用它。在 mongoose api-ref 中阅读更多内容:http: //mongoosejs.com/docs/api.html#document_Document-toObject

示例如下所示:

User.findById(id, function(err, user) {
    if (err) return next(err);
    let userObject = user.toObject();
    // userObject is plain object
});
于 2018-06-21T19:52:25.020 回答
1

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

 db.getCollection('myDatabaseTestCollectionName').update({"FieldToDelete": {$exists: true}}, {$unset:{"FieldToDelete":1}}, false, true);
于 2019-06-20T06:03:15.653 回答
1

尝试:

User.findOne({}, function(err, user){
  // user.key_to_delete = null; X
  `user.key_to_delete = undefined;`

  delete user.key_to_delete;

  user.save();
});
于 2020-04-19T19:48:54.563 回答
0

所有这些答案的问题在于它们适用于一个领域。例如,假设我想从我的 Document 中删除所有字段,如果它们是空字符串""。首先,您应该检查字段是否为空字符串,将其放入$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 },
    );
}

于 2019-02-20T06:28:03.407 回答
-1

我相信,如果您希望将特定字段删除到集合中,您应该这样做:

User.remove ({ key_to_delete: req.params.user.key_to_delete});
于 2021-12-02T18:13:51.530 回答
-6

您可以使用删除 user._doc.key

于 2016-10-18T11:55:21.663 回答