2010-12-20 17 views
52

estoy usando el Mongoose Biblioteca para acceder a MongoDB con Node.jsEliminación de una clave de un documento usando MongoDB Mangosta

¿Hay una manera de quitar una clave de un documento? es decir, no solo establece el valor en nulo, sino que lo elimina?

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(); 
}); 
+1

pensé que había encontrado, pero después de algunas pruebas: probablemente no. Sin embargo, esto tiene una buena discusión sobre el tema. http://groups.google.com/group/mongoose-orm/browse_thread/thread/6053e3b8d4fe9098 – Stephen

+0

LOL, no importa, supongo que esta fue tu publicación. – Stephen

+0

En realidad era mío :) – staackuser2

Respuesta

99

En las primeras versiones, se habría necesitado para caer abajo del controlador de nodo-mongodb-natal. Cada modelo tiene un objeto de colección que contiene todos los métodos que ofrece node-mongodb-native. Lo que puede hacer la acción en cuestión por esto:

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); 
+0

Esto se ha corregido en Mongoose 2.X, por lo que puede dejar la colección. – staackuser2

+0

¿Cuál es la solución? ¿Cómo lo hace uno? He leído los documentos que tengo. – grantwparks

+4

O use 'User.update ({_id: id}, {$ unset: {field: 1}}, callback)' o si tiene una instancia de documento, establezca la ruta como indefinida y luego guárdela: 'doc.field = indefinido; doc.save() ' – aaronheckmann

5

En la sintaxis mongo para eliminar alguna clave que necesita hacer lo siguiente:

{ $unset : { field : 1} } 

parece a Mangosta la misma.

Editar

Comprobar this ejemplo.

+0

¿Puedes aclarar esta respuesta y dar un ejemplo de código relacionado con el código de ejemplo anterior? –

+0

lo siento pero no tengo experiencia en la mangosta. Por encima de la sintaxis está la sintaxis de mongo, así que supongo que el controlador para cualquier idioma admite esto. Encontré algún ejemplo, compruébalo en mi respuesta. –

+0

Awesome funcionó como un encanto :) –

1

Podría ser esto un problema lado como el uso de

function (user) 

en lugar de

function(err, user) 

de devolución de llamada del hallazgo? Solo trato de ayudar con esto porque ya tenía el caso.

34

Usted querrá hacer esto:

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

Eso lo configurará como nulo, no lo que el OP está pidiendo. –

+16

A partir de la versión 2.4.0 establecer una clave de documento para undefined pasará $ unset a mongodb http: //aaronheckmann.posterous.com/mongoose-240 –

+0

Confirmado. Esto funciona en 2.6.7. – superluminary

13

Uso mangosta y el uso de cualquiera de las funciones anteriores me hizo el requerimiento. La función compila sin errores pero el campo aún permanecerá.

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

hizo el truco para mí.

+0

Apoyando esta útil respuesta, lástima @ alexander-link no fue una respuesta en 2015 (http://stackoverflow.com/questions/4486926/delete-a-key-from-a-mongodb-document-using -mongoose # comment50381329_6938733) – w00t

-1

puede utilizar eliminar user._doc.key

Cuestiones relacionadas