Pregunta

Estoy usando el Mangosta Biblioteca para acceder a MongoDB con Node.js

¿Hay una manera de eliminar una clave de un documento ? es decir, no sólo para establecer el valor nulo, pero eliminarlo?

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();
});
¿Fue útil?

Solución

En las primeras versiones, se habría tenido que desplegar el controlador de nodo-mongodb-natal. Cada modelo tiene un objeto de colección que contiene todos los métodos que ofrece nodo-mongodb-natal. Lo que puede hacer la acción en cuestión por lo siguiente:

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

Desde la versión 2.0 se puede hacer:

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

Y desde la versión 2.4, si tiene una instancia de un modelo ya que puede hacer:

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

Otros consejos

Usted querrá hacer esto:

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

Yo uso mangosta y el uso de cualquiera de las funciones anteriores me hizo el requerimiento. Las compilaciones de función libre de errores, pero el campo seguiría siendo.

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

hizo el truco para mí.

En mongo sintaxis para eliminar algunas claves que debe hacer lo siguiente:

{ $unset : { field : 1} }

Parece que en el mismo Mangosta.

Editar

este ejemplo .

Podría ser esto un problema lado como utilizando

function (user)

en lugar de

function(err, user)

de devolución de llamada del hallazgo? Tratando de ayudar con esto, ya que ya tenía el caso.

Mangosta documento no es un objeto javascript simple y es por eso que no se puede utilizar el operador de eliminación. (O unset de la biblioteca 'lodash').

Sus opciones son conjunto doc.path = null || sin definir o utilizar el método Document.toObject () para encender doc mangosta a objeto llanura y desde allí use como de costumbre. Leer más en mangosta api-ref: http://mongoosejs.com/docs/api.html#document_Document-toObject

Ejemplo sería algo como esto:

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

El problema con todas estas respuestas es que trabajan para un campo. por ejemplo, digamos que quiero eliminar todos los campos de mi documento si fueran una "" cadena vacía. En primer lugar se debe comprobar si el campo es una cadena vacía puso 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 },
    );
}

si desea eliminar una clave de la colección de probar este método. Esto funcionó para mí

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

Puede utilizar user._doc.key eliminar

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top