Jak całkowicie usunąć pole z dokumentu MongoDB?

307
{ 
    name: 'book',
    tags: {
        words: ['abc','123'],
        lat: 33,
        long: 22
    }
}

Załóżmy, że to dokument. Jak wordscałkowicie usunąć „ ” ze wszystkich dokumentów w tej kolekcji? Chcę, aby wszystkie dokumenty bez " words„:

 { 
     name: 'book',
     tags: {
         lat: 33,
         long: 22
     }
}
TIMEX
źródło

Odpowiedzi:

531

Spróbuj tego: jeśli Twoja kolekcja to „przykład”

db.example.update({}, {$unset: {words:1}}, false, true);

Zobacz to:

http://www.mongodb.org/display/DOCS/Updating#Updating-%24unset

AKTUALIZACJA :

Powyższy link nie obejmuje już „rozbrojenia”. Pamiętaj, aby dodać, {multi: true}jeśli chcesz usunąć to pole ze wszystkich dokumentów w kolekcji; w przeciwnym razie usunie go tylko z pierwszego znalezionego dokumentu, który pasuje. Zobacz zaktualizowaną dokumentację:

https://docs.mongodb.com/manual/reference/operator/update/unset/

Przykład:

db.example.update({}, {$unset: {words:1}} , {multi: true});
Shaunak
źródło
1
Zobacz rozwiązanie tego pytania, aby uzyskać wyjaśnienie fałszywego / prawdziwego stackoverflow.com/questions/7714216/...
Dsel
1
Nigdzie na tej stronie nie ma już komentarza „Nic Cottrell” :)
Dan Dascalescu,
6
Czy coś mi umknęło, czy było to złe przez ponad 8 lat, bo tak tags.wordspowinno być $unset, nie words? Zobacz także odpowiedź Salvadora Dali.
Dan Dascalescu
1
Możesz także użyć updateManyzamiast {multi:true}, tj.db.example.updateMany({},{"$unset":{words:""}})
Kip
158

Na początku nie rozumiałem, dlaczego pytanie ma nagrodę (myślałem, że pytanie ma fajną odpowiedź i nie ma nic do dodania), ale potem zauważyłem, że odpowiedź, która została zaakceptowana i oceniona 15 razy, była w rzeczywistości błędna!

Tak, musisz użyć $unsetoperatora , ale to ustawienie usunie klucz słów, który nie istnieje dla dokumentu dla kolekcji. Zasadniczo nic to nie da.

Musisz więc powiedzieć Mongo, aby poszukała znaczników dokumentu, a następnie słów, używając notacji kropkowej . Prawidłowe zapytanie to.

db.example.update(
  {},
  { $unset: {'tags.words':1}},
  false, true
)

Dla uzupełnienia powiem o innym sposobie zrobienia tego , co jest znacznie gorsze, ale w ten sposób możesz zmienić pole dowolnym kodem niestandardowym (nawet w oparciu o inne pole z tego dokumentu).

Salvador Dali
źródło
2
Oprócz tego, jeśli tagi są tablicą, wyglądałoby to tak: db.example.update ({}, {$ unset: {'tags. $ []. Words': 1}}, false, true)
Manan Shah
21
db.example.updateMany({},{"$unset":{"tags.words":1}})

Możemy również użyć tego do aktualizacji wielu dokumentów.

Vipul
źródło
2
uznaję to za bardziej zrozumiałe niż podanie false, truejako ostatnie dwa argumenty doupdate()
Kip
17

Aby usunąć lub usunąć pole w MongoDB

  • Dla pojedynczego rekordu

    db.getCollection('userData').update({}, {$unset: {pi: 1}})
  • Do Multi Record

    db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})
Wirusowy Patel
źródło
2

Próbowałem zrobić coś podobnego do tego, ale zamiast tego usunąłem kolumnę z osadzonego dokumentu. Znalezienie rozwiązania zajęło mi trochę czasu i był to pierwszy post, na który natknąłem się, więc pomyślałem, że opublikuję to tutaj dla każdego, kto spróbuje zrobić to samo.

Powiedzmy, że zamiast tego twoje dane wyglądają tak:

{ 
  name: 'book',
  tags: [
    {
      words: ['abc','123'],
      lat: 33,
      long: 22
    }, {
      words: ['def','456'],
      lat: 44,
      long: 33
    }
  ]
}

Aby usunąć kolumnę wordsz osadzonego dokumentu, wykonaj następujące czynności:

db.example.update(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}},
  {multi: true}
)

lub używając updateMany

db.example.updateMany(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}}
)

$unsetTylko edytować go, czy wartość istnieje, ale nie zrobi bezpieczną nawigację (przyzwyczajenie to sprawdzić, czy tagsistnieje pierwszy), więc istnieje potrzeba na dokumencie osadzonego.

Używa to operatora pozycyjnego ( $[]), który został wprowadzony w wersji 3.6

Jonathon Gardner
źródło
1

Domyślnie metoda update () aktualizuje pojedynczy dokument. Ustaw Multi Parameter, aby zaktualizować wszystkie dokumenty spełniające kryteria zapytania.

Zmieniono w wersji 3.6. Składnia:

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ]
   }
)

Przykład:

db.getCollection('products').update({},{$unset: {translate:1, qordoba_translation_version:1}}, {multi: true})

W twoim przykładzie:

db.getCollection('products').update({},{$unset: {'tags.words' :1}},  {multi: true})
Amitesh
źródło
1

Zaczynając Mongo 4.2, można również użyć nieco innej składni:

// { name: "book", tags: { words: ["abc", "123"], lat: 33, long: 22 } }
db.collection.update({}, [{ $unset: ["tags.words"] }], { many: true })
// { name: "book", tags: { lat: 33, long: 22 } }

Metoda aktualizacji może również akceptować potok agregacji (zwróć uwagę na kwadratowe nawiasy oznaczające użycie potoku agregacji).

Oznacza to $unset, że używany jest operator agregujący (w przeciwieństwie do operatora „kwerendowego” ), którego składnia zajmuje tablicę pól.

Xavier Guihot
źródło
1

Rozwiązanie dla PyMongo (Python mongo):

db.example.update({}, {'$unset': {'tags.words':1}}, multi=True);
Yakir Tsuberi
źródło
0

I dla mongomappera

  • Dokument: Shutoff
  • Pole do usunięcia: typ_wyłączenia

Shutoff.collection.update( {}, { '$unset' => { 'shutoff_type': 1 } }, :multi => true )

Jon Kern
źródło
0

Ponieważ ciągle szukałem tej strony, szukając sposobu na usunięcie pola za pomocą MongoEngine, wydaje mi się, że może być pomocne opublikowanie tutaj również MongoEngine:

Example.objects.all().update(unset__tags__words=1)
Automat pralniczy
źródło
-2

{name: 'book', tags: {words: ['abc', '123'], lat: 33, long: 22}}

Odp .:

db.tablename.remove ({'tags.words': ['abc', '123']})

Poonam Agrawal
źródło
-3

Sprawdzanie, czy istnieją „słowa”, a następnie usuwanie z dokumentu

    db.users.update({"tags.words" :{$exists: true}},
                                           {$unset:{"tags.words":1}},false,true);

true oznacza aktualizację wielu dokumentów, jeśli są dopasowane.

Abhi
źródło
Nie musisz sprawdzać istnienia. Te stany dokumentacji , że: „Jeśli pole nie istnieje, wtedy $ rozbrojony nic nie robi (czyli bez operacji).”
Dan Dascalescu
-4

możesz to zrobić również w agregacji, używając projektu w wersji 3.4

{$ project: {"tags.words": 0}}

joel Raja
źródło
-7

Aby odwołać się do pakietu i usunąć różne „klucze”, spróbuj tego

db['name1.name2.name3.Properties'].remove([
{
     "key" : "name_key1"
},
{
     "key" : "name_key2"
},
{
     "key" : "name_key3"
}
)]
aspadacio
źródło