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();
});
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top