Usuń według _id w konsoli MongoDB

143

W konsoli MongoDB jak mogę usunąć rekord według id? Oto moja kolekcja:

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

A oto polecenia, które wypróbowałem, ale nie działają:

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

Usuwanie według nazwy działa:

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

To jest w powłoce przeglądarki na mongodb.org, jeśli ma to jakiekolwiek znaczenie

Dzięki

Typo Johnson
źródło
Żadne z rozwiązań nie działało, dopóki nie dodałem wywołania zwrotnego: db.test_users.remove ({"_id": '4d512b45cc9374271b02ec4f'}, function (err, data) {});
rttmax

Odpowiedzi:

280

Bardzo blisko. To zadziała:

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

tj. nie potrzebujesz nowego dla ObjectId.

Należy również zauważyć, że w niektórych sterownikach / narzędziach remove()jest teraz przestarzały i deleteOnelub deleteManypowinien być używany zamiast niego.

Nic Cottrell
źródło
4
będzie działać również bez cudzysłowów wokół _id db.test_users.remove ({_id: ObjectId ("4d512b45cc9374271b02ec4f")});
alfonsodev
Próbowałem tego: TimeAndSpace.remove ({"_id": ObjectId ("8Bd2dZ778LXejYNrL")}); ... i otrzymałem komunikat „Uncaught ReferenceError: ObjectId is not specified at <anonymous>: 2: 13”
B. Clay Shannon,
@BClay Identyfikator obiektu oczekuje wprowadzenia danych szesnastkowych (może również małych liter), więc nie działa między innymi na znakach X, Z.
Nic Cottrell
2
To jest niedorzeczne.
Guy,
Jeśli _idpole nie jest generowany automatycznie (czyli nie jest to ObjectId, ale String), można po prostu napisać wartość Instrumentu _idpod cudzysłowie: db.your.database.remove({"_id": "your value"}).
Aleksandar
16

Odpowiedź jest taka, że ​​konsola / powłoka sieciowa na mongodb.org zachowuje się inaczej i nie tak, jak się spodziewałem. Zainstalowana wersja w domu działała doskonale bez problemu tj; automatycznie wygenerowany identyfikator _id w powłoce internetowej został zapisany w następujący sposób:

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

Ta sama konfiguracja dokumentu w domu i automatycznie wygenerowany identyfikator _id zostały zapisane w następujący sposób:

"_id" : ObjectId("4d5192665777000000005490")

Zapytania działały przeciwko temu drugiemu bez problemu.

Typo Johnson
źródło
1
Czy na pewno są zapisywane inaczej w dokumencie BSON? Te różnice wyglądają na to, że klient po prostu inaczej formatuje dane wyjściowe.
Nic Cottrell
14

Cóż, w twoim przykładzie _id jest obiektem, więc wystarczy przekazać obiekt

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

To powinno działać

Edycja: Dodano końcowy paren, aby upewnić się, że został skompilowany.

Dmitri
źródło
Próbowałem też, ale nie usunęło rekordu: db.test_users.remove ({"_id": {"$ oid": "4d513345cc9374271b02ec6c"}}); ps: zaktualizowałem pytanie, aby to pokazać
Typo Johnson,
W swoim pytaniu powiedziałeś, że próbowałeś tego: db.test_users.remove ({"_id": {"$ oid": new ObjectId ("4d512b45cc9374271b02ec4f")}});
Dmitri,
Tak, właśnie zaktualizowałem pytanie, dzięki, próbowałem obu i żadna z nich nie działa. Może to dlatego, że nie możesz usunąć usługi podrzędnej?
Typo Johnson
w ten sposób zwraca „nieznany operator: $ oid”
Arman Ortega
14

Jeśli chcesz usunąć za pomocą listy identyfikatorów, działa to świetnie.

db.CollectionName.remove({
    "_id": {
        $in: [
            ObjectId("0930292929292929292929"),
            ObjectId("0920292929292929292929")
        ]
     }
}) 
mjwrazor
źródło
6

Czy w zestawie replik masz wiele węzłów mongodb?

Znalazłem (używam przez Robomongo gui mongo shell, chyba to samo dotyczy innych przypadków), że poprawna składnia usuwania, tj.

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

... nie działa, chyba że jesteś połączony z głównym węzłem zestawu replik.

Anentropowy
źródło
5

Właśnie wpadłem na to sam i ta odmiana zadziałała dla mnie:

db.foo.remove({**_id**: new ObjectId("4f872685a64eed5a980ca536")})
Karoy
źródło
5

najpierw pobierz funkcję ObjectID z mongodb ObjectId = require (mongodb) .ObjectID;

wtedy możesz wywołać _id za pomocą funkcji usuwania

"_id": ObjectId ("4d5192665777000000005490")

SA Khan
źródło
2

Mimo że ten post jest nieaktualny, collection.remove jest przestarzała! collection.delete_onenależy użyć zamiast tego!

Więcej informacji można znaleźć tutaj, pod hasłem #remove

Yuval Meshorer
źródło
2

Załóżmy, że mamy tę kolekcję manekinów:

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

po prostu użyj:

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

zostanie usunięty jako odpowiedź:

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

Otóż ​​to.

Asad S.
źródło
0

Rozwiązanie i przykład:

1- C: \ MongoDB \ Server \ 3.2 \ bin> mongo (nie wydawaj jeszcze komendy, ponieważ nie jesteś jeszcze połączony z żadną bazą danych, jesteś połączony tylko z serwerem bazy danych mongodb).

2-

show dbs analytics_database 0.000GB lokalnie 0.000GB test_database 0.000GB

3-

use test_database przełączone na db test_database

4-

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

teraz widzisz WriteResult ({"nRemoved": 1}) wynosi 1, a nie 0.

Gotowe.

Łajno
źródło
0
db.collection("collection_name").deleteOne({_id:ObjectID("4d513345cc9374271b02ec6c")})
kamula
źródło
Proszę wyjaśnić, dlaczego / jak to rozwiązuje problem. Zobacz, jak odpowiedzieć
jasie