Удалить ключ из документа MongoDB, используя Mongoose
-
11-10-2019 - |
Вопрос
Я использую Мангуста Библиотека для доступа к mongodb с node.js
Есть ли способ Удалить ключ из документа? т.е. не просто установить значение 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();
});
Решение
В ранних версиях вам нужно было сбросить драйвер Node-Mongodb-родного. Каждая модель имеет объект сбора, который содержит все методы, которые предлагает Node-MongoDB-родной. Таким образом, вы можете сделать это действие этим:
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.findOne({}, function(err, user){
user.key_to_delete = undefined;
user.save();
});
Я использую Mongoose, и использование любой из вышеперечисленных функций сделал мне требование. Функция компилируется без ошибок, но поле все равно останется.
user.set('key_to_delete', undefined, {strict: false} );
Сделал свой трюк для меня.
В синтаксисе Mongo, чтобы удалить какой -то ключ, который вам нужно сделать, выполнив следующее:
{ $unset : { field : 1} }
Кажется, в мангузе то же самое.
Редактировать
Проверять это пример.
Может ли это быть боковой проблемой, как использование
function (user)
вместо
function(err, user)
Для обратного вызова находка? Просто пытаюсь помочь с этим, как у меня уже было дело.
Документ Mongoose не является простым объектом JavaScript, и поэтому вы не можете использовать оператор Delete. (Или unset
из библиотеки «Лодаш»).
Ваши варианты - установить doc.path = null || Неопределенный или использовать метод document.tobject (), чтобы превратить Mongoose Doc в простой объект и оттуда использовать его как обычно. Узнайте больше в Mongoose Api-Ref:http://mongoosejs.com/docs/api.html#document_document-tobject
Пример будет выглядеть примерно так:
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);
Вы можете использовать delete user._doc.key