/ / Wiosenne zapytanie MongoDB z wieloma opcjonalnymi parametrami $ w kolekcji - mongodb, wiosenne dane, wiosenne dane-mongodb, mongodb-java

Zapytanie Spring Data MongoDB z wieloma opcjonalnymi parametrami $ in Collection - mongodb, spring-data, spring-data-mongodb, mongodb-java

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 № 1

Musisz 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