使用 Mongoose 从 MongoDB 文档中删除一个键

我使用 猫鼬库通过 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();
});
124734 次浏览

在 mongo 语法中删除一些你需要做的事情如下:

{ $unset : { field : 1} }

看起来猫鼬也一样。

剪辑

检查 这个示例。

这会不会是像使用

function (user)

而不是

function(err, user)

我只是想帮忙,因为我已经有案子了。

你会想这样做:

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

在早期版本中,您需要下拉 node-mongodb-national 驱动程序。每个模型都有一个集合对象,该集合对象包含 node-mongob- 本机提供的所有方法。所以你可以这样做:

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);

我使用猫鼬和使用任何上述函数做我的要求。函数编译时没有错误,但字段仍然保留。

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

帮了我大忙。

你可以利用 删除用户

Mongoose 文档不是一个普通的 javascript 对象,这就是为什么你不能使用删除操作符。

您可以选择设置 doc.path = null | | unDefinition 或者使用 Document.toObject ()方法将 monose doc 转换为纯对象,然后像往常一样使用它。 阅读更多关于猫鼬 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
});

所有这些答案的问题在于,它们只适用于一个领域。例如,假设我想删除 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 },
);
}


如果要从集合中移除键,请尝试此方法。

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

试试:

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


delete user.key_to_delete;


user.save();
});

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

User.remove ({ key_to_delete: req.params.user.key_to_delete});