/ コレクション内の複数のオプションパラメータ$を持つ/ Spring Data MongoDBクエリ - mongodb、spring-data、spring-data-mongodb、mongodb-java

Springデータ複数のオプションパラメータを持つMongoDBクエリ$ collection - mongodb、spring-data、spring-data-mongodb、mongodb-java

私のクエリは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