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

时间:2010-12-20 04:42:05

标签: mongodb node.js mongoose document-database

我正在使用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();
});

11 个答案:

答案 0 :(得分:127)

在早期版本中,您需要删除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);

答案 1 :(得分:39)

你想要这样做:

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

答案 2 :(得分:24)

我使用mongoose并且使用上述任何功能都符合我的要求。该函数编译无错误,但该字段仍然存在。

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

为我做了诀窍。

答案 3 :(得分:5)

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

{ $unset : { field : 1} }

似乎在Mongoose也一样。

修改

检查this示例。

答案 4 :(得分:1)

这可能是一个像使用

这样的问题
function (user)

而不是

function(err, user)

查找回调?我试图帮助解决这个问题。

答案 5 :(得分:1)

猫鼬的文档不是普通的javascript对象,这就是为什么您不能使用delete运算符的原因。(或者来自{lodash'库的unset)。

您的选项是设置doc.path = null || undefined或使用Document.toObject()方法将猫鼬文档转换为纯对象,然后从那里像往常一样使用它。 在猫鼬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
});

答案 6 :(得分:1)

尝试:

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

  delete user.key_to_delete;

  user.save();
});

答案 7 :(得分:0)

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

答案 8 :(得分:0)

如果要从集合中删除密钥,请尝试此方法。 这对我有用

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

答案 9 :(得分:0)

我正在尝试从文档中删除名为“ cover”的字段 但它是缓冲区类型。因此由于某种原因,即使我将其设为undefined,在给我undefined结果的同时,它仍然保持二进制类型 this route returns the cover field from document matching profile property

`

exports.update = (req, res) => {
  let form = new formidable.IncomingForm();
  form.keepExtension = true;
  form.parse(req, (err, fields, files) => {
    if (err) {
      return res.status(400).json({
        error: "Photo could not be uploaded",
      });
    }
    let user = req.profile;
    user = _.extend(user, fields);

    if (fields.password && fields.password.length < 6) {
      return res.status(400).json({
        error: "Password should be min 6 characters long",
      });
    }
    if (fields.cover == null) {
      user.cover = undefined;
    }

    if (files.photo) {
      if (files.photo.size > 10000000) {
        return res.status(400).json({
          error: "Image should be less than 1mb",
        });
      }
      sharp(files.photo.path)
        .resize(300, 300, {
          fit: "cover",
        })
        .jpeg({
          quality: 90,
        })
        .toFile(`assets/users/${user.profile}.jpg`, (err, info) => {
          if (err) {
            return res.status(400).json({
              error: "unable to process the image",
            });
          }
        });
    }
    if (files.cover) {
      if (files.cover.size > 10000000) {
        return res.status(400).json({
          error: "Image should be less than 1mb",
        });
      }
      sharp(files.cover.path)
        .resize(1200, 675, {
          fit: "cover",
        })
        .jpeg({
          quality: 90,
        })
        .toBuffer((err, compressed, info) => {
          User.findOneAndUpdate(
            { profile: user.profile },
            { cover: compressed }
          )
            .select("_id")
            .exec((err, updatedUser) => {
              if (err)
                res.status(400).json({
                  error: "Unable to process the image",
                });
            });
        });
    }

    console.log("user", user);

    user.save((err, result) => {
      if (err) {
        return res.status(400).json({
          error: errorHandler(err),
        });
      }
      user.hashed_password = undefined;
      user.salt = undefined;
      user.photo = undefined;
      res.json(user);
      console.log("result", result);
    });
  });
};

`

答案 10 :(得分:-2)

你可以用 删除user._doc.key