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@email.com"
  }
]

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


Ż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.


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.


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.


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

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.


5

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

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

5

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

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

"_id": ObjectId ("4d5192665777000000005490")



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.


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.


0
db.collection("collection_name").deleteOne({_id:ObjectID("4d513345cc9374271b02ec6c")})

Proszę wyjaśnić, dlaczego / jak to rozwiązuje problem. Zobacz, jak odpowiedzieć
jasie
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.