1

全文検索を含むさまざまな基準で MongoDB コレクションを検索するための API を提供しようとしています。これは Scala プロジェクト (Play FWIW 内) であるため、 Casbahの抽象化であるSalatを使用しています。

次のコードは正常に動作します。

MySalatDao
.find(MongoDBObject("$text" -> MongoDBObject("$search" -> "Vidya")), MongoDBObject("score" -> MongoDBObject("$meta" -> "textScore")))
.sort(orderBy = MongoDBObject("score" -> MongoDBObject("$meta" -> "textScore")))

ただし、最終的には複数の条件で検索し、全文検索スコアで結果を並べ替える必要があるため、Casbah の MongoDBObjectクエリ ビルダー機能(下部) を調べました。

だから私はこのように上記を複製しようとしました:

val builder = MongoDBObject.newBuilder
builder += "$text" -> MongoDBObject("$search" -> "Vidya")
builder += "score" -> MongoDBObject("$meta" -> "textScore")
MySalatDao
.find(a.result())
.sort(orderBy = MongoDBObject("score" -> MongoDBObject("$meta" -> "textScore")))

これにより、次の例外が発生します。

com.mongodb.MongoException: Can't canonicalize query: BadValue must have $meta projection for all $meta sort keys
  at com.mongodb.QueryResultIterator.throwOnQueryFailure(QueryResultIterator.java:214)
  at com.mongodb.QueryResultIterator.init(QueryResultIterator.java:198)
  at com.mongodb.QueryResultIterator.initFromQueryResponse(QueryResultIterator.java:176)
  at com.mongodb.QueryResultIterator.<init>(QueryResultIterator.java:64)
  at com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:86)
  at com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:66)
.
.

score以前、クエリにコンポーネントを含めなかったときに、このエラーを見たことがあります。しかし、それを実行すると (最初のコード スニペットに見られるように) 機能し、クエリ ビルダーを含むバージョンは同等であると考えました。

さらに言えば、 を呼び出すと、次のようになりbuilder.result().toString()ます。

{ "$text" : { "$search" : "Vidya"} , "score" : { "$meta" : "textScore"}}

クエリビルダーを機能させるための助けをいただければ幸いです。

4

1 に答える 1