Eliminar por _id en la consola MongoDB

137

En la consola MongoDB, ¿cómo puedo eliminar un registro por id? Aquí está mi colección:

[ 
  {
     "_id" : { "$oid" : "4d512b45cc9374271b02ec4f" },
     "name" : "Gazza"
  },
  {
     "_id" : { "$oid" : "4d513345cc9374271b02ec6c" },
     "name" : "Dave",
     "adminOf" : { },
     "email" : "[email protected]"
  }
]

Y aquí están los comandos que he probado que no funcionan:

db.test_users.remove( {"_id":{"$oid":new ObjectId("4d512b45cc9374271b02ec4f")}});
db.test_users.remove( {"_id":{"$oid":"4d513345cc9374271b02ec6c"}});
db.test_users.remove( {"_id":"4d512b45cc9374271b02ec4f"});
db.test_users.remove( {"_id":new ObjectId("4d512b45cc9374271b02ec4f")});

Eliminar por nombre funciona:

db.test_users.remove( {"name":"Gazza"});

Esto está en el shell del navegador en mongodb.org si eso hace alguna diferencia

Gracias

Typo Johnson
fuente
Ninguna de las soluciones funcionó para mí hasta que agregué una devolución de llamada: db.test_users.remove ({"_id": '4d512b45cc9374271b02ec4f'}, function (err, data) {});
rttmax

Respuestas:

272

Muy cerca. Esto funcionará:

db.test_users.deleteOne( {"_id": ObjectId("4d512b45cc9374271b02ec4f")});

es decir, no necesita una nueva para ObjectId.

Asimismo, cabe destacar que en algunos conductores / herramientas, remove()se ha desaprobado y se deleteOneo deleteManyse debe utilizar en su lugar.

Nic Cottrell
fuente
44
funcionará también sin comillas alrededor de _id db.test_users.remove ({_id: ObjectId ("4d512b45cc9374271b02ec4f")});
alfonsodev
Intenté esto: TimeAndSpace.remove ({"_id": ObjectId ("8Bd2dZ778LXejYNrL")}); ... y obtuve, "Error de referencia no capturado: ObjectId no está definido en <anónimo>: 2: 13"
B. Clay Shannon
@BClay El ID del objeto espera una entrada hexadecimal (tal vez también en minúsculas), por lo que falla en los caracteres X, Z, entre otros.
Nic Cottrell
2
Esto es ridículo.
Guy
Si el _idcampo no se genera de forma automática (es decir, no es un OBJECTID, pero una cadena), sólo puede escribir el valor de la _idvirtud de las comillas: db.your.database.remove({"_id": "your value"}).
Aleksandar
16

La respuesta es que la consola web / shell en mongodb.org se comporta de manera diferente y no como yo esperaba. Una versión instalada en casa funcionó perfectamente sin problemas, es decir; el _id generado automáticamente en el shell web se guardó así:

"_id" : { "$oid" : "4d512b45cc9374271b02ec4f" },

La misma configuración de documentos en casa y el _id generado automáticamente se guardó así:

"_id" : ObjectId("4d5192665777000000005490")

Las consultas trabajaron contra este último sin problema.

Typo Johnson
fuente
1
¿Estás seguro de que se guardan de manera diferente en el documento BSON? Esas diferencias parecen ser que el cliente simplemente formatea la salida de manera diferente.
Nic Cottrell
13

Bueno, el _id es un objeto en su ejemplo, por lo que solo necesita pasar un objeto

'db.test_users.remove({"_id": { "$oid" : "4d513345cc9374271b02ec6c" }})'

Esto debería funcionar

Editar: se agregó el par final para asegurarse de que se compila.

Dmitri
fuente
Intenté eso también, no eliminó el registro: db.test_users.remove ({"_id": {"$ oid": "4d513345cc9374271b02ec6c"}}); PS: actualizada la pregunta para mostrar este
Typos Johnson
En su pregunta, dijo que intentó esto: db.test_users.remove ({"_id": {"$ oid": new ObjectId ("4d512b45cc9374271b02ec4f")}});
Dmitri
Sí, actualicé la pregunta hace un momento, gracias, he intentado ambas y ninguna funciona. ¿Quizás esto se deba a que no puede eliminar en una propiedad secundaria?
Typo Johnson
usar esa forma devuelve "operador desconocido: $ oid"
Arman Ortega
13

Si desea eliminar por una lista de ID, esto funciona muy bien.

db.CollectionName.remove({
    "_id": {
        $in: [
            ObjectId("0930292929292929292929"),
            ObjectId("0920292929292929292929")
        ]
     }
}) 
mjwrazor
fuente
6

¿Tiene múltiples nodos mongodb en un conjunto de réplicas?

Encontré (estoy usando a través de Robomongo gui mongo shell, supongo que lo mismo se aplica en otros casos) que la sintaxis de eliminación correcta, es decir

db.test_users.remove({"_id": ObjectId("4d512b45cc9374271b02ec4f")})

... no funciona a menos que esté conectado al nodo primario del conjunto de réplicas.

Anéntrópico
fuente
4

Acabo de encontrarme con esto y esta variación funcionó para mí:

db.foo.remove({**_id**: new ObjectId("4f872685a64eed5a980ca536")})
Karoy
fuente
4

primero obtenga la función ObjectID del mongodb ObjectId = require (mongodb) .ObjectID;

entonces puedes llamar al _id con la función de borrar

"_id": ObjectId ("4d5192665777000000005490")

SA Khan
fuente
2

Aunque esta publicación no está actualizada, collection.remove está en desuso. collection.delete_onedebe usarse en su lugar!

Puede encontrar más información aquí en #remove

Yuval Meshorer
fuente
1

Supongamos que tenemos esta colección ficticia:

{ "_id" : ObjectId("5ea53fedaa79db20d4e14284"), "item" : "planner", "qty" : 75 }

simplemente use:

db.inventory.deleteOne({ _id: ObjectId("5ea53fedaa79db20d4e14284") })

se eliminará con esto como respuesta:

{ "acknowledged" : true, "deletedCount" : 1 }

Eso es.

Asad S
fuente
0

Solución y ejemplo:

1- C: \ MongoDB \ Server \ 3.2 \ bin> mongo (no emita el comando todavía porque aún no está conectado a ninguna base de datos, solo está conectado al servidor de base de datos mongodb).

2-

muestre dbs analytics_database 0.000GB local 0.000GB test_database 0.000GB

3-

use test_database cambiado a db test_database

4-

db.Collection.remove ({"_ id": ObjectId ("5694a3590f6d451c1500002e")}, 1); WriteResult ({"nRemoved": 1})

ahora ve que WriteResult ({"nRemoved": 1}) es 1, no 0.

Hecho.

Estiércol
fuente