Löschen eines Schlüssels aus einem MongoDB-Dokument mit Mongoose
-
11-10-2019 - |
Frage
Ich bin mit der Mongoose Bibliothek für den Zugriff auf MongoDB mit node.js
Gibt es eine Möglichkeit zu Entfernen eines Schlüssels aus einem Dokument ? das heißt nicht nur den Wert auf Null gesetzt, aber es entfernen?
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();
});
Lösung
In frühen Versionen, würden Sie haben erforderlich, um die Knoten-mongodb-native Treiber Drop-Down. Jedes Modell verfügt über eine Sammlung Objekt, das alle Methoden, die Knoten-mongodb-native Angebote enthält. So können Sie die Aktion in Frage dies tun können:
User.collection.update({_id: user._id}, {$unset: {field: 1 }});
Seit Version 2.0 können Sie tun:
User.update({_id: user._id}, {$unset: {field: 1 }}, callback);
Und seit Version 2.4, wenn Sie eine Instanz eines Modells haben schon können Sie tun:
doc.field = undefined;
doc.save(callback);
Andere Tipps
Sie wollen, dies zu tun:
User.findOne({}, function(err, user){
user.key_to_delete = undefined;
user.save();
});
verwende ich Mungo und unter Verwendung eines beliebigen der oben genannten Funktionen hat mir die Anforderung. Die Funktion compiliert fehlerfrei, aber das Feld würde noch bleiben.
user.set('key_to_delete', undefined, {strict: false} );
hat den Trick für mich.
im Mongo Syntax einige Schlüssel löschen Sie Folgendes tun müssen:
{ $unset : { field : 1} }
Es scheint bei Mongoose gleich.
Bearbeiten
Überprüfen Sie diese Beispiel.
Könnte dies eine Seite Problem sein wie mit
function (user)
statt
function(err, user)
für den Rückruf der finden? versuche nur, um Hilfe bei diesem, wie ich schon der Fall war.
Mongoose Dokument ist nicht ein einfaches Javascript-Objekt und das ist, warum Sie nicht löschen Betreiber nutzen können. (Oder unset
von ‚lodash‘ Bibliothek).
Ihre Optionen sind auf Set doc.path = null || undefiniert oder Document.toObject () Methode verwenden Mungo doc in einfachem Objekt zu drehen und von dort wie üblich verwendet werden. Lesen Sie mehr in Mungo api-ref: http://mongoosejs.com/docs/api.html#document_Document-toObject
Beispiel wie folgt aussehen würde:
User.findById(id, function(err, user) {
if (err) return next(err);
let userObject = user.toObject();
// userObject is plain object
});
Das Problem mit all diesen Antworten ist, dass sie für ein Feld arbeiten. zum Beispiel lassen Sie uns sagen, dass ich alle Felder aus meinem Dokument löschen wollen, wenn sie eine leere Zeichenfolge ""
waren.
Zuerst sollten Sie überprüfen, ob Feld leere Zeichenfolge setzte es $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 },
);
}
, wenn Sie einen Schlüssel aus der Sammlung entfernen möchten versuchen, diese Methode. für mich gearbeitet
db.getCollection('myDatabaseTestCollectionName').update({"FieldToDelete": {$exists: true}}, {$unset:{"FieldToDelete":1}}, false, true);
Sie verwenden können löschen user._doc.key