Mam przypadek użycia, w którym moje zapytanie musi znaleźć na podstawie 3 opcjonalnych pól, a jeden z nich jest przekazywany jako kolekcja.
Część "3 pola opcjonalne" jest już rozwiązana przez ten post Spring Data MongoDB AND / OR zapytanie z wieloma opcjonalnymi parametrami
Jednak jestem biegły w kwestii z $in
dla kolekcji złożonej.
Na przykład w poniższym zapytaniu
{ $and :
[{
$and:
[
{$or : [ { $where: "?0 == null" } , { a : ?0 }]},
{$or : [ { $where: "?1 == null" } , { b : ?1 }]},
{$or : [ { $where: "?2 == null" } , { c : ?2 }]}
]
}]
}
W moim przypadku pole a
w rzeczywistości jest przekazywana jako kolekcja, muszę znaleźć ten obiekt w MongoDB z plikiem a
jest $in
kolekcja, którą przekazałem.
Próbowałem czegoś takiego
{ $and :
[{
$and:
[
{$or : [ { $where: "?0 == null" } , { a : { $in : ?0 }}]},
{$or : [ { $where: "?1 == null" } , { b : ?1 }]},
{$or : [ { $where: "?2 == null" } , { c : ?2 }]}
]
}]
}
Jednak dostałem NPE do tego, gdy przechodzę w null
kolekcja.
Odpowiedzi:
0 dla odpowiedzi № 1Musisz przetestować długość kolekcji, jak pokazano tutaj spring-data-mongo - opcjonalne parametry zapytania? Możesz także pozbyć się najwyższego poziomu $ i.
{ $and :
[
{$or : [ { $where: "?0.length == 0" } , { a : { $in : ?0 }}]},
{$or : [ { $where: "?1 == null" } , { b : ?1 }]},
{$or : [ { $where: "?2 == null" } , { c : ?2 }]}
]
}
0 dla odpowiedzi nr 2
W rzeczywistości nie możesz użyć $ in na liście opcjonalnejParametr, ponieważ gdy nie zostanie określony, będzie miał wartość null, a $ in accept only list. Aby to zrobić, musisz dodać [] wokół opcjonalnego parametru listy, a następnie spłaszczyć tę listę w następujący sposób:
{ $and :
[
{$or : [ { $where: "?0 == null;" },
{ $where: "[].concat.apply([],[?0]).indexOf(this.a) !== -1;"}]},
{$or : [ { $where: "?1 == null" } , { b : ?1 }]},
{$or : [ { $where: "?2 == null" } , { c : ?2 }]}
]
}
użyj tego dla wersji mongo <3.4 i od 3.4 Możesz użyć includes
funkcja zamiast indexOf