Wpis z mikrobloga

[ #mongodb #naukaprogramowania #nodejs ]

Każdy rekord w bazie ma pole, w którym trzymam tablicę z tagami (każdy z nich ma po 3). Każdy tag ma po 5 możliwości tj. pierwszy: "a1, a2, a3, a4, a5", drugi: "b1, b2, b3, b4, b5", trzeci: "c1, c2, c3, c4, c5".

Przesyłam na backend tablicę z tagami, żeby po nich szukać odpowiednich rekordów. Ta tablica może wyglądać np tak: ["a1", "a2", "c1", b4"] albo ["a1", "a2", "a3"] itd. tj. nie ma sprecyzowanej ilości możliwych tagów przy danym zapytaniu (maksymalnie może ich być 15). Teraz chciałbym, żeby zwracało mi rekordy po tych właśnie tagach, ALE dokładnie po tych tagach, po których leci zapytanie, a nie rekordy, w których pojawiają się pojedyncze tagi.

Np. tablica z frontu ma taką postać ["wypok", "rogale"] -> zwraca mi rekordy w których znajdują się te tagi, a nie szuka mi pojedynczych tagów i zwraca rekordy w których znajdują się "wypok" albo "rogale".

db.collection.find( { "tags": {$in: tagsArr } ); -> takie zapytanie zwraca mi wszystkie wyniki, w których znajduje się pojedynczy tag. Próbowałem też z aggregate z $match, ale efekt jest ten sam.

Próbowałem napisać zapytanie przy pomocy $or i $and. Wtedy każdy rekord miał osobne pole dla danej kategorii tj. A dla a1,a2.. itd. B dla b1... i C dla c1...

upraszczając:

$or( ($and( A: $in tagsarr, B: $in tagsarr, C: $in tagsarr), ($and..... tutaj dalej pozostałe kombinacje tj. AB, AC, BC i pojedyncze A B C)) -> no i to działało, ale tylko jeśli w każdym z pól znalazło cokolwiek z tablicy (albo jakiś inny warunek, sprawdzało tylko pierwszego $anda w kolejności, do kolejnych nie przechodziło), a to nie jest wymagane, bo może być tak, że tylko A i C będzie przesyłane.

Będę wdzięczy za pomoc, już drugi dzień nad tym siedzę i nie mogę sobie poradzić. Z góry dzięki Mirky.
  • 5
@sokytsinolop: próbowałem z tym też, zapomniałem napisać w poście. Z $all działa wszystko ale tylko przy pierwszym zapytaniu. Wszystko działa na checkboxach, każdy checkbox ma przypisany dla true nazwę tagu (jakby to było ważne to na froncie jest ng 1.6) i mam podpięty event listener 'change', który przy każdym zaznaczeniu checkboxa wysyła zapytanie. No i pierwszym zapytaniu ładnie mi wszystko filtruje, ale jeśli odznaczę i zaznaczę inny filtr to już nic
@sokytsinolop: zwracało mi pusty obiekt, okazało się, że była to wina tego, że jak odznaczałem checkbox to słało w tablicy nulle, jak wyczyściłem z nich tablice przed przekazaniem do zapytania to wszystko zadziałało, dziękuję za naprowadzenie. :)