使用Mongoose从MongoDB文档中删除密钥
我正在使用该库通过node.js访问MongoDB 是否有方法从文档中删除密钥?i、 不只是将值设置为null,而是将其删除使用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
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.keyMongoose文档不是一个普通的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后,我必须删除带有数组的字段。请注意,字符串是键的路径。因此,如果要删除的对象是嵌套的,则必须指定其路径。这个答案解决了我的问题!