it-swarm.com.de

Löschen Sie mit Mongoose einen Schlüssel aus einem MongoDB-Dokument

Ich verwende die Mongoose Library für den Zugriff auf MongoDB mit node.js

Gibt es eine Möglichkeit, einen Schlüssel aus einem Dokument entfernen? d. h. den Wert nicht einfach auf null setzen, sondern 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();
});
65

In früheren Versionen mussten Sie den node-mongodb-nativen Treiber löschen. Jedes Modell verfügt über ein Sammlungsobjekt, das alle Methoden enthält, die Node-mongodb-native bietet. So können Sie die betreffende Aktion folgendermaßen ausführen:

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

Seit Version 2.0 können Sie:

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

Und seit Version 2.4 können Sie, wenn Sie bereits über eine Instanz eines Modells verfügen, Folgendes tun:

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

Sie möchten das tun:

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

Ich benutze Mungo und benutze eine der oben genannten Funktionen, um die Anforderung zu erfüllen. Die Funktion wird fehlerfrei übersetzt, das Feld bleibt jedoch erhalten.

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

hat den Trick für mich gemacht.

22
Noushad PP

Um in der Mongo-Syntax einige Schlüssel zu löschen, müssen Sie Folgendes tun:

{ $unset : { field : 1} }

Scheint bei Mongoose das gleiche. 

Bearbeiten

Überprüfen Sie dieses Beispiel.

5
Andrew Orsich

Könnte dies ein Nebenproblem sein wie die Verwendung von

function (user)

anstatt

function(err, user)

für den Rückruf des Find? Ich habe nur versucht zu helfen, da ich bereits den Fall hatte.

1
Luc

Das Mongoose-Dokument ist KEIN einfaches Javascript-Objekt. Aus diesem Grund können Sie den delete-Operator nicht verwenden (oder unset aus der 'lodash'-Bibliothek).

Ihre Optionen sind doc.path = null || zu setzen undefined oder verwenden Sie die Document.toObject () - Methode, um moose-doc in ein einfaches Objekt umzuwandeln und es wie gewohnt zu verwenden. Lesen Sie mehr in mongoose api-ref: http://mongoosejs.com/docs/api.html#document_Document-toObject

Ein Beispiel würde ungefähr so ​​aussehen:

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

Wenn Sie einen Schlüssel aus der Sammlung entfernen möchten, probieren Sie diese Methode aus. Das hat bei mir funktioniert

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

das Problem bei all diesen Antworten ist, dass sie für ein Feld arbeiten. Angenommen, ich möchte alle Felder aus meinem Dokument löschen, wenn sie eine leere Zeichenfolge ""..__ wären. Zuerst sollten Sie prüfen, ob das Feld eine leere Zeichenfolge ist. Setzen Sie es in $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