私のクエリは3つのオプションフィールドに基づいて検索する必要があり、そのうちの1つがコレクションとして渡されるユースケースがあります。
"3 optional fields"の部分はすでにこの投稿で解決されています Spring Data MongoDBの複数のオプションパラメータとのAND / ORクエリ
しかし、私はこの問題に陥っています $in
提出されたコレクションのために。
たとえば、次のクエリでは
{ $and :
[{
$and:
[
{$or : [ { $where: "?0 == null" } , { a : ?0 }]},
{$or : [ { $where: "?1 == null" } , { b : ?1 }]},
{$or : [ { $where: "?2 == null" } , { c : ?2 }]}
]
}]
}
私の場合は、フィールド a
実際にはコレクションとして渡されるので、MongoDBでそれらのオブジェクトをファイルして見つける必要があります。 a
は $in
私が渡したコレクション
私はこのようなことを試してみました
{ $and :
[{
$and:
[
{$or : [ { $where: "?0 == null" } , { a : { $in : ?0 }}]},
{$or : [ { $where: "?1 == null" } , { b : ?1 }]},
{$or : [ { $where: "?2 == null" } , { c : ?2 }]}
]
}]
}
しかし、私がこれを渡すと、私はこれのためにNPEを得ました null
コレクション。
回答:
回答№1は0ここに示すように、コレクションの長さをテストする必要があります。 spring-data-mongo - オプションのクエリパラメータ また、トップレベルを取り除くことができます $と.
{ $and :
[
{$or : [ { $where: "?0.length == 0" } , { a : { $in : ?0 }}]},
{$or : [ { $where: "?1 == null" } , { b : ?1 }]},
{$or : [ { $where: "?2 == null" } , { c : ?2 }]}
]
}
回答№2の場合は0
あなたは実際にはオプションリストのために$ inを使うことはできませんこれは、指定されていない場合はnullになり、$は受け入れ専用リストになるためです。そのためには、オプションのlistパラメータの周りに[]を追加してから、このリストを次のようにフラットにします。
{ $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 }]}
]
}
mongoのバージョン<3.4以降ではこれを使用してください。3.4以降 includes
関数の代わりに indexOf