18

JSON ベースのクエリ メソッドで spring-data mongo を使用していますが、検索クエリでオプションのパラメーターを許可する方法がわかりません。

たとえば、次の機能があるとします

@Query("{ 'name' : {$regex : ?0, $options : 'i'}, 'createdDate' : {$gte : ?1, $lt : ?2 }} }")
List<MyItem> getItemsLikeNameByDateRange(String name, Date startDateRange, Date endDateRange);

-しかし、メソッドにNULL値が渡された場合、名前の正規表現の一致を適用したり、日付範囲の制限を適用したりしたくありませんでした。

現時点では、mongoTemplate を使用してクエリを作成する必要があるようです。

代替手段はありますか - または mongoTemplate を使用するのが最良の選択肢ですか?

ありがとう

4

2 に答える 2

27

これをブール論理で実装するために、私は次のことを行い、プログラミング言語で利用可能な操作に変換します

:query != null -> field == :query
!(:query != null) || (field == :query)
(:query == null) || (field == :query)

プレーン SQL では、これは次のように行われます。

where (null = :query) or (field = :query)

MongoDB では、これは $where を通じて行われます

{ $where: '?0 == null || this.field == ?0' } 

読みやすさを犠牲にしてすべてを関数に組み込むのではなく、Mongo Operations を使用することで、これを少しスピードアップできます。残念ながら機能しません。

{ $or : [ { $where: '?0 == null' } , { field : ?0 } ] } 

だからあなたが持っているのは

@Query("{ $or : [ { $where: '?0 == null' } , { field : ?0 } ] }")
List<Something> findAll(String query, Pageable pageable);

これをさらに拡張して、in/all 句の配列を処理できます

@Query("{ $or : [ { $where: '?0.length == 0' } , { field : { $in : ?0 } } ] }")
List<Something> findAll(String query, Pageable pageable);
于 2012-08-28T18:06:18.520 に答える
0

アルキメデスの答えに加えて:
一致したドキュメントの数が必要な場合は、に置き換え$where$exprください。

@Query("{ $or : [ { $expr: { $eq: ['?0', 'null'] } } , { field : ?0 } ] }")
Page<Something> findAll(String query, Pageable pageable);
于 2021-07-30T14:49:28.197 に答える