/ / Spring Data MongoDB-Abfrage mit mehreren optionalen Parametern $ in Collection - Mongodb, Federdaten, Federdaten-Mongodb, Mongodb-Java

Spring Data MongoDB-Abfrage mit mehreren optionalen Parametern $ in Collection - mongodb, spring-data, spring-data-mongodb, mongodb-java

Ich habe einen Anwendungsfall, bei dem meine Abfrage anhand von 3 optionalen Feldern ermittelt werden muss und eines davon als Sammlung übergeben wird.

Der Teil "3 optionale Felder" wird durch diesen Beitrag bereits gelöst Spring Data MongoDB-UND / ODER-Abfrage mit mehreren optionalen Parametern

Ich bin jedoch mit der Problematik bei der $in für die Sammlung eingereicht.

Zum Beispiel in der folgenden Abfrage

{ $and :
[{
$and:
[
{$or : [ { $where: "?0 == null" } , { a : ?0 }]},
{$or : [ { $where: "?1 == null" } , { b : ?1 }]},
{$or : [ { $where: "?2 == null" } , { c : ?2 }]}
]
}]
}

In meinem Fall das Feld a Ist eigentlich als Sammlung übergeben, muss ich diese Objekte in MongoDB mit abgelegt finden a ist $in die Sammlung habe ich übergeben.

Ich habe es mit so etwas versucht

 { $and :
[{
$and:
[
{$or : [ { $where: "?0 == null" } , { a : { $in : ?0 }}]},
{$or : [ { $where: "?1 == null" } , { b : ?1 }]},
{$or : [ { $where: "?2 == null" } , { c : ?2 }]}
]
}]
}

Ich habe jedoch NPE dafür bekommen, wenn ich in einem null Sammlung.

Antworten:

0 für die Antwort № 1

Sie müssen die Erfassungslänge wie hier gezeigt testen Spring-Data-Mongo - optionale Abfrageparameter? Sie können auch die oberste Ebene loswerden $ und.

{ $and :
[
{$or : [ { $where: "?0.length == 0" } , { a : { $in : ?0 }}]},
{$or : [ { $where: "?1 == null" } , { b : ?1 }]},
{$or : [ { $where: "?2 == null" } , { c : ?2 }]}
]
}

0 für die Antwort № 2

Sie können $ in für eine optionale Liste nicht verwendenWenn der Parameter nicht angegeben wird, ist er null und $ in der Liste "Accept only". Um dies zu tun, müssen Sie um den optionalen Listenparameter [] hinzufügen und diese Liste dann wie folgt glätten:

{ $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 }]}
]
}

Verwenden Sie das für Mongo-Version <3.4 und seit 3.4 können Sie verwenden includes Funktion statt indexOf