Удаление ключа из документа MongoDB с использованием Mongoose
Я использую библиотеку Mongoose для доступа к MongoDB с помощью node.js
Есть ли способ удалить ключ из документа? т.е. не просто установить значение в значение null, но удалить его?
User.findOne({}, function(err, user){
//correctly sets the key to null... but it still present in the document
user.key_to_delete = null;
// doesn't seem to have any effect
delete user.key_to_delete;
user.save();
});
Ответы
Ответ 1
В ранних версиях вам нужно было бы свернуть родной драйвер node -mongodb. Каждая модель имеет объект коллекции, который содержит все методы, которые предлагает 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);
Ответ 2
Вы захотите сделать это:
User.findOne({}, function(err, user){
user.key_to_delete = undefined;
user.save();
});
Ответ 3
Я использую мангуст и использую любую из вышеперечисленных функций, выполнил ли я это требование. Функция компилирует ошибку, но поле все равно останется.
user.set('key_to_delete', undefined, {strict: false} );
сделал трюк для меня.
Ответ 4
В синтаксисе mongo для удаления некоторого ключа вам необходимо выполнить следующие действия:
{ $unset : { field : 1} }
Кажется, что у Мангуста то же самое.
Edit
Отметьте этот пример.
Ответ 5
Это может быть проблема, связанная с использованием
function (user)
вместо
function(err, user)
для обратного вызова поиска? Просто пытаюсь помочь с этим, поскольку я уже имел дело.
Ответ 6
Mongoose документ не является простым JavaScript Object и почему вы не можете использовать оператор удаления. (Или unset
с unset
от "lodash" библиотеки).
Вы можете установить doc.path = null || undefined или использовать метод Document.toObject(), чтобы превратить документ Мангуста в простой объект и использовать его как обычно. Подробную информацию можно найти в mongoose 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
});
Ответ 7
проблема со всеми этими ответами состоит в том, что они работают для одной области. например, допустим, я хочу удалить все поля из моего документа, если они были пустой строкой ""
. Сначала вы должны проверить, является ли поле пустой строкой, установить его в $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
если вы хотите удалить ключ из коллекции, попробуйте этот метод. это сработало для меня
db.getCollection('myDatabaseTestCollectionName').update({"FieldToDelete": {$exists: true}}, {$unset:{"FieldToDelete":1}}, false, true);
Ответ 9
вы можете использовать
удалить user._doc.key