Remover por _id no console do MongoDB

137

No console do MongoDB, como posso remover um registro por ID? Aqui está minha coleção:

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

E aqui estão os comandos que eu tentei que não funcionam:

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")});

A remoção pelo nome funciona:

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

Isso está no shell do navegador em mongodb.org, se isso faz alguma diferença

obrigado

Typo Johnson
fonte
Nenhuma das soluções funcionou para mim até eu adicionar um retorno de chamada: db.test_users.remove ({"_id": '4d512b45cc9374271b02ec4f'}, function (err, data) {});
Rtmax #

Respostas:

272

Muito perto. Isso funcionará:

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

ou seja, você não precisa de um novo para o ObjectId.

Além disso, observe que em alguns drivers / ferramentas, remove()agora está obsoleto e deleteOneou deleteManydeve ser usado.

Nic Cottrell
fonte
4
funcionará também sem aspas em torno de _id db.test_users.remove ({_id: ObjectId ("4d512b45cc9374271b02ec4f")});
Alfonsodev
Eu tentei o seguinte: TimeAndSpace.remove ({"_id": ObjectId ("8Bd2dZ778LXejYNrL")}); ... e eu obtive "UnAught ReferenceError: ObjectId não está definido em <anonymous>: 2: 13"
B. Clay Shannon
@BClay O ID do objeto espera entrada hexadecimal (talvez também em minúscula), por isso está falhando nos caracteres X, Z, entre outros.
Nic Cottrell
2
Isso é ridículo.
Guy
Se o _idcampo não é gerado automaticamente (ou seja, não é um ObjectId, mas uma String), você pode apenas escrever o valor do _idsob aspas: db.your.database.remove({"_id": "your value"}).
Aleksandar
16

A resposta é que o console da web / shell em mongodb.org se comporta de maneira diferente e não como eu esperava. Uma versão instalada em casa funcionou perfeitamente sem problemas, ou seja; o _id gerado automaticamente no shell da web foi salvo assim:

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

A mesma configuração de documento em casa e o _id gerado automaticamente foram salvos assim:

"_id" : ObjectId("4d5192665777000000005490")

As consultas funcionaram contra o último sem problemas.

Typo Johnson
fonte
1
Tem certeza de que eles são salvos de forma diferente no documento BSON? Essas diferenças parecem que o cliente está apenas formatando a saída de maneira diferente.
Nic Cottrell
13

Bem, o _id é um objeto no seu exemplo, então você só precisa passar um objeto

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

Isso deve funcionar

Edit: Adicionado paren à direita para garantir que ele seja compilado.

Dmitri
fonte
Tentei também não remover o registro: db.test_users.remove ({"_id": {"$ oid": "4d513345cc9374271b02ec6c"}}); ps: atualizou a pergunta para mostrar isso #
Typo Johnson
Na sua pergunta, você disse que tentou o seguinte: db.test_users.remove ({"_id": {"$ oid": new ObjectId ("4d512b45cc9374271b02ec4f")}});
Dmitri
Sim, atualizei a pergunta agora, obrigado. Tentei os dois e nem o trabalho. Talvez seja porque você não pode excluir uma subpropriedade?
Typo Johnson
Usando essa forma retornos "Operador desconhecido: $ oid"
Arman Ortega
13

Se você deseja remover por uma lista de IDs, isso funciona muito bem.

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

Você tem vários nós mongodb em um conjunto de réplicas?

Descobri (estou usando via Robomongo gui mongo shell, acho que o mesmo se aplica em outros casos) que a sintaxe de remoção correta, ou seja,

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

... não funciona, a menos que você esteja conectado ao nó principal do conjunto de réplicas.

Anentrópico
fonte
4

Acabei de me deparar com isso e essa variação funcionou para mim:

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

primeiro obtenha a função ObjectID do mongodb ObjectId = require (mongodb) .ObjectID;

então você pode chamar o _id com a função delete

"_id": ObjectId ("4d5192665777000000005490")

SA Khan
fonte
2

Embora esta postagem esteja desatualizada, o collection.remove está obsoleto! collection.delete_onedeve ser usado em seu lugar!

Mais informações podem ser encontradas aqui em #remove

Yuval Meshorer
fonte
1

Suponha que tenhamos essa coleção fictícia:

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

basta usar:

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

ele será excluído com isso como resposta:

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

É isso aí.

Asad S
fonte
0

Solução e exemplo:

1- C: \ MongoDB \ Server \ 3.2 \ bin> mongo (não emita comando ainda porque você ainda não está conectado a nenhum banco de dados, você está conectado apenas ao servidor de banco de dados mongodb).

2-

mostre dbs analytics_database 0.000GB local 0.000GB test_database 0.000GB

3-

use test_database alternado para db test_database

4-

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

agora você vê WriteResult ({"nRemoved": 1}) é 1 e não 0.

Feito.

Estrume
fonte