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