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