Eliminación de una clave de un documento usando MongoDB Mangosta
-
11-10-2019 - |
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();
});
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
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