web-dev-qa-db-fra.com

Supprimer une clé d'un document MongoDB à l'aide de Mongoose

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

Est-il possible de supprimer une clé d'un document? c'est-à-dire ne pas simplement définir la valeur sur null, mais la supprimer?

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

Dans les premières versions, vous auriez eu besoin de dérouler le pilote node-mongodb-native. Chaque modèle a un objet collection qui contient toutes les méthodes proposées par node-mongodb-native. Donc, 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 déjà une instance d'un modèle, vous pouvez faire:

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

Vous voudrez faire ceci:

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

J'utilise la mangouste et l'utilisation de l'une des fonctions ci-dessus m'a fait l'exigence. La fonction compile sans erreur mais le champ reste toujours.

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

a fait le tour pour moi.

22
Noushad PP

À la syntaxe mongo pour supprimer certaines clés, vous devez procéder comme suit:

{ $unset : { field : 1} }

Semble à Mongoose le même. 

Modifier

Vérifiez ceci exemple.

5
Andrew Orsich

Cela pourrait-il être un problème secondaire, comme utiliser

function (user)

au lieu de

function(err, user)

pour le rappel de la trouvaille? J'essayais juste de l'aider, car j'avais déjà l'affaire.

1
Luc

Le document Mongoose n'est PAS un objet javascript simple, c'est pourquoi vous ne pouvez pas utiliser l'opérateur delete (ou unset de la bibliothèque 'lodash').

Vos options sont de définir doc.path = null || undefined ou utiliser la méthode Document.toObject () pour transformer un document mongoose en objet simple et l’utiliser comme d’habitude. Plus d’informations dans mongoose 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
});
0
petarr

si vous voulez supprimer une clé de la collection, essayez cette méthode. cela a fonctionné pour moi

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

le problème avec toutes ces réponses est qu’elles travaillent pour un domaine. Par exemple, supposons que je veuille supprimer tous les champs de mon document s’il s’agissait d’une chaîne vide "". Vous devez d’abord vérifier si le champ est une chaîne vide et le mettre en $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
Milad ranjbar