Удаление ключа из документа MongoDB с помощью Mongoose
Я использую Мангуста библиотека для доступа к MongoDB с узлом.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();
});
7 ответов
В ранних версиях вам нужно было бы сбросить драйвер 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);
вы захотите сделать это:
User.findOne({}, function(err, user){
user.key_to_delete = undefined;
user.save();
});
Я использую мангуста, и использование любой из вышеперечисленных функций сделало мне требование. Функция компилируется без ошибок, но поле все равно останется.
user.set('key_to_delete', undefined, {strict: false} );
сделал трюк для меня.
в синтаксисе mongo для удаления некоторого ключа вам нужно сделать следующее:
{ $unset : { field : 1} }
Кажется, у Мангуста то же самое.
редактировать
Регистрация этой пример.
может ли это быть проблемой, как с помощью
function (user)
вместо
function(err, user)
для обратного вызова находки ? Просто пытаюсь помочь с этим, так как у меня уже было дело.
Мангуст документ не является простым объектом javascript, и поэтому вы не можете использовать оператор delete.(Или unset
из библиотеки' lodash').
ваши варианты должны установить doc.path = null / / undefined или использовать документ.метод toObject (), чтобы превратить Mongoose 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
});