Question

J'utilise le Mongoose bibliothèque pour accéder à MongoDB avec Node.js

Y at-il un moyen de supprimer une clé d'un document ? dire non seulement définir la valeur null, mais l'enlever?

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();
});
Était-ce utile?

La solution

Dans les premières versions, vous auriez besoin de descendre le conducteur noeud-mongodb natif. Chaque modèle a un objet de collection qui contient toutes les méthodes qui offre noeud-MongoDB natif. Ainsi, vous pouvez faire l'action en question par ceci:

User.collection.update({_id: user._id}, {$unset: {field: 1 }});

Depuis la version 2.0, vous pouvez faire:

User.update({_id: user._id}, {$unset: {field: 1 }}, callback);

Et depuis la version 2.4, si vous avez une instance d'un modèle, vous pouvez déjà faire:

doc.field = undefined;
doc.save(callback);

Autres conseils

Vous aurez envie de faire ceci:

User.findOne({}, function(err, user){
  user.key_to_delete = undefined;
  user.save();
});

J'utilise mangouste et en utilisant l'une des fonctions ci-dessus m'a fait l'exigence. La fonction compile sans erreur, mais le champ resteraient.

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

a fait l'affaire pour moi.

mongo syntaxe pour supprimer une clé que vous devez faire ce qui suit:

{ $unset : { field : 1} }

Semble à Mongoose même.

Modifier

Vérifier cet exemple .

Serait-ce un problème de côté comme l'utilisation

function (user)

au lieu de

function(err, user)

pour le rappel de la découverte? Juste essayer d'aider avec ce que j'avais déjà le cas.

Document Mongoose n'est pas un objet simple javascript et qui est la raison pour laquelle vous ne pouvez pas utiliser l'opérateur de suppression. (Ou unset de la bibliothèque « de lodash »).

Vos options sont ensemble doc.path = null || non défini ou d'utiliser la méthode Document.toObject () pour activer mangouste doc pour objet simple et à partir de là l'utiliser comme d'habitude. En savoir plus mangouste api-ref: http://mongoosejs.com/docs/api.html#document_Document-toObject

Exemple ressemblerait à quelque chose comme ceci:

User.findById(id, function(err, user) {
    if (err) return next(err);
    let userObject = user.toObject();
    // userObject is plain object
});

le problème avec toutes ces réponses est qu'ils travaillent pour un champ. par exemple, disons que je veux supprimer tous les champs de mon document si elles étaient une "" chaîne vide. D'abord, vous devriez vérifier si le champ est une chaîne vide mis à $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 },
    );
}

si vous souhaitez supprimer une clé de la collection essayer cette méthode. cela a fonctionné pour moi

 db.getCollection('myDatabaseTestCollectionName').update({"FieldToDelete": {$exists: true}}, {$unset:{"FieldToDelete":1}}, false, true);

vous pouvez utiliser Supprimer user._doc.key

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top