Jeśli mam ten schemat ...
person = {
name : String,
favoriteFoods : Array
}
... gdzie favoriteFoods
tablica jest zapełniona ciągami. Jak mogę znaleźć wszystkie osoby, które mają „sushi” jako swoje ulubione jedzenie za pomocą mangusty?
Miałem nadzieję na coś w stylu:
PersonModel.find({ favoriteFoods : { $contains : "sushi" }, function(...) {...});
(Wiem, że nie ma $contains
w mongodb, wyjaśniając tylko to, czego się spodziewałem, zanim poznałem rozwiązanie)
favouriteFoods
:favouriteFoods:[{type:Schema.Types.ObjectId, ref:'Food'}]
PersonModel.find({ favouriteFoods.text: "sushi" }, ...); person = { name : String, favouriteFoods : [{text:String}] }
W
$contains
mongodb nie ma operatora.Możesz użyć odpowiedzi od JohnnyHK, gdy to działa. Najbliższa analogia do tego, co zawiera mongo, polega na
$in
tym, że zapytanie to wyglądałoby następująco:źródło
$in
jest używany, gdy masz wiele wartości zapytań, a dokument musi być zgodny z jedną z nich. W przypadku odpowiedzi odwrotnej (o to chodzi w tym pytaniu) odpowiedź JohnnyHK jest poprawna. Chciałem zagłosować, ale ta odpowiedź może być pomocna dla innych osób, które znajdą się na tej stronie.PersonModel.find({favouriteFoods: {"$in": ["sushi", "hotdog"]}})
Wydaje mi się,
$all
że w tej sytuacji byłoby bardziej odpowiednie. Jeśli szukasz osoby, która jest w sushi, robisz:Ponieważ możesz chcieć bardziej filtrować wyszukiwanie, na przykład:
$in
jest jak OR i$all
jak AND. Sprawdź to: https://docs.mongodb.com/manual/reference/operator/query/all/źródło
W przypadku, gdy tablica zawiera obiekty, na przykład jeśli tablica obejmuje następujące obiekty
favouriteFoods
:możesz użyć następującego zapytania:
źródło
Jeśli potrzebujesz znaleźć dokumenty zawierające elementy NULL w tablicy poddokumentów, znalazłem to zapytanie, które działa całkiem dobrze:
To zapytanie pochodzi z tego postu: Tablica zapytań MongoDb z zerowymi wartościami
To było świetne znalezisko i działa znacznie lepiej niż moja własna początkowa i zła wersja (która okazała się działać dobrze tylko dla tablic z jednym elementem):
źródło
Chociaż zgadzanie się z funkcją find () jest najskuteczniejsze w przypadku użycia. Nadal istnieje $ dopasowanie struktury agregacji, aby ułatwić zapytanie o dużą liczbę wpisów i wygenerować małą liczbę wyników, które mają dla ciebie wartość, szczególnie dla grupowania i tworzenia nowych plików.
źródło
Incase z lookup_food_array jest tablicą.
Incase z lookup_food_array jest ciągiem.
źródło
W przypadku Loopback3 wszystkie podane przykłady nie działały dla mnie lub tak szybko jak przy użyciu interfejsu API REST. Ale pomogło mi to znaleźć dokładną odpowiedź, której potrzebowałem.
{"where":{"arrayAttribute":{ "all" :[String]}}}
źródło
Jeśli chcesz użyć czegoś takiego jak operator „zawiera” za pomocą javascript, zawsze możesz użyć do tego wyrażenia regularnego ...
na przykład. Załóżmy, że chcesz odzyskać klienta o nazwie „Bartolomew” jako nazwy
źródło
Wiem, że ten temat jest stary, ale dla przyszłych ludzi, którzy mogliby zastanawiać się nad tym samym pytaniem, innym niezwykle nieefektywnym rozwiązaniem mogłoby być:
Pozwala to uniknąć wszystkich optymalizacji MongoDB, więc nie używaj go w kodzie produkcyjnym.
źródło