Удалить ключ из документа MongoDB с помощью Mongoose - PullRequest
73 голосов
/ 20 декабря 2010

Я использую библиотеку Mongoose для доступа к MongoDB с помощью node.js

Есть ли способ удалить ключ из документа ? т.е. не просто установить значение на ноль, а удалить его?

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();
});

Ответы [ 9 ]

129 голосов
/ 04 августа 2011

В ранних версиях вам нужно было бы выпустить драйвер 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);
40 голосов
/ 09 мая 2011

Вы захотите сделать это:

User.findOne({}, function(err, user){
  user.key_to_delete = undefined;
  user.save();
});
25 голосов
/ 28 сентября 2016

Я использую мангуст, и использование любой из вышеперечисленных функций соответствовало мне.Функция компилируется без ошибок, но поле все равно остается.

user.set('key_to_delete', undefined, {strict: false} );

помогло мне.

5 голосов
/ 20 декабря 2010

В синтаксисе Монго, чтобы удалить какой-то ключ, вам нужно сделать следующее:

{ $unset : { field : 1} }

Кажется у Мангуста то же самое.

Редактировать

Проверьте этот пример.

1 голос
/ 21 июня 2018

Документ Mongoose НЕ является простым объектом javascript, и поэтому вы не можете использовать оператор удаления (или unset из библиотеки 'lodash').

Вы можете установить 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
});
1 голос
/ 13 апреля 2011

Может ли это быть побочной проблемой, например, использование

function (user)

вместо

function(err, user)

для обратного вызова поиска?Просто пытаюсь помочь с этим, как у меня уже было дело.

0 голосов
/ 20 июня 2019

, если вы хотите удалить ключ из коллекции, попробуйте этот метод. это сработало для меня

 db.getCollection('myDatabaseTestCollectionName').update({"FieldToDelete": {$exists: true}}, {$unset:{"FieldToDelete":1}}, false, true);
0 голосов
/ 20 февраля 2019

проблема со всеми этими ответами в том, что они работают для одного поля. например, скажем, я хочу удалить все поля из моего документа, если они были пустой строкой "". Сначала вы должны проверить, является ли поле пустой строкой, установить его в $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 },
    );
}

0 голосов
/ 18 октября 2016

вы можете использовать удалить user._doc.key

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...