{
name: 'book',
tags: {
words: ['abc','123'],
lat: 33,
long: 22
}
}
Załóżmy, że to dokument. Jak words
całkowicie usunąć „ ” ze wszystkich dokumentów w tej kolekcji? Chcę, aby wszystkie dokumenty bez " words
„:
{
name: 'book',
tags: {
lat: 33,
long: 22
}
}
mongodb
mongodb-query
database
TIMEX
źródło
źródło
tags.words
powinno być$unset
, niewords
? Zobacz także odpowiedź Salvadora Dali.updateMany
zamiast{multi:true}
, tj.db.example.updateMany({},{"$unset":{words:""}})
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ć
$unset
operatora , 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.
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).
źródło
Możemy również użyć tego do aktualizacji wielu dokumentów.
źródło
false, true
jako ostatnie dwa argumenty doupdate()
Aby usunąć lub usunąć pole w MongoDB
Dla pojedynczego rekordu
Do Multi Record
źródło
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:
Aby usunąć kolumnę
words
z osadzonego dokumentu, wykonaj następujące czynności:lub używając
updateMany
$unset
Tylko edytować go, czy wartość istnieje, ale nie zrobi bezpieczną nawigację (przyzwyczajenie to sprawdzić, czytags
istnieje pierwszy), więc istnieje potrzeba na dokumencie osadzonego.Używa to operatora pozycyjnego (
$[]
), który został wprowadzony w wersji 3.6źródło
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:
Przykład:
W twoim przykładzie:
źródło
Zaczynając
Mongo 4.2
, można również użyć nieco innej składni: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.źródło
Rozwiązanie dla PyMongo (Python mongo):
źródło
I dla mongomappera
Shutoff.collection.update( {}, { '$unset' => { 'shutoff_type': 1 } }, :multi => true )
źródło
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:
źródło
{name: 'book', tags: {words: ['abc', '123'], lat: 33, long: 22}}
Odp .:
db.tablename.remove ({'tags.words': ['abc', '123']})
źródło
Sprawdzanie, czy istnieją „słowa”, a następnie usuwanie z dokumentu
true oznacza aktualizację wielu dokumentów, jeśli są dopasowane.
źródło
możesz to zrobić również w agregacji, używając projektu w wersji 3.4
{$ project: {"tags.words": 0}}
źródło
Aby odwołać się do pakietu i usunąć różne „klucze”, spróbuj tego
źródło