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();
});
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);
Vous voudrez faire ceci:
User.findOne({}, function(err, user){
user.key_to_delete = undefined;
user.save();
});
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.
À 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.
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.
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
});
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);
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 },
);
}