Domanda

Sto utilizzando il Mongoose libreria per l'accesso MongoDB con node.js

C'è un modo per rimuovere una chiave da un documento ? cioè non solo impostare il valore nullo, ma rimuoverlo?

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();
});
È stato utile?

Soluzione

Nelle prime versioni, si avrebbe avuto bisogno di cadere giù il driver nodo MongoDB-native. Ogni modello ha un oggetto da collezione che contiene tutti i metodi che le offerte nodo-mongodb-native. Così si può fare l'azione in questione da questo:

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

Dalla versione 2.0 si può fare:

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

E a partire dalla versione 2.4, se si dispone di un'istanza di un modello già si può fare:

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

Altri suggerimenti

Ti consigliamo di fare questo:

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

Io uso mangusta e utilizzando una delle funzioni di cui sopra mi ha fatto il requisito. Le compila funzione di errore gratuito ma il campo sarebbe ancora rimangono.

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

ha fatto il trucco per me.

Al mongo sintassi per eliminare qualche chiave è necessario eseguire le seguenti operazioni:

{ $unset : { field : 1} }

sembra a Mongoose stesso.

Modifica

questo esempio .

Questo potrebbe essere un problema lato come l'utilizzo di

function (user)

anziché

function(err, user)

per richiamo del ritrovamento? Solo cercando di aiutare con questo come ho già avuto il caso.

documento Mongoose non è un oggetto JavaScript pianura ed è per questo non è possibile utilizzare operatore delete. (O unset dalla libreria 'lodash').

Le opzioni sono a set doc.path = null || indefinito o di utilizzare il metodo Document.toObject () per accendere doc mongoose all'oggetto piana e da lì usano come al solito. Per saperne di più in mangusta api-ref: http://mongoosejs.com/docs/api.html#document_Document-toObject

Esempio sarebbe simile a questa:

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

Il problema con tutte queste risposte è che funzionano per un campo. per esempio diciamo che voglio eliminare tutti i campi dal mio documento se fossero un "" stringa vuota. In primo luogo si dovrebbe verificare se il campo è una stringa vuota messo a $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 },
    );
}

se si desidera rimuovere una chiave da collezione provare questo metodo. questo ha lavorato per me

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

è possibile utilizzare user._doc.key delete

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top