Vid*_*dya 1 scala mongodb casbah salat
我试图提供一个API来搜索MongoDB集合的各种标准,包括全文搜索.由于这是一个Scala项目(在Play FWIW中),我使用的是Salat,一个围绕Casbah的抽象.
以下代码工作正常:
MySalatDao
.find(MongoDBObject("$text" -> MongoDBObject("$search" -> "Vidya")), MongoDBObject("score" -> MongoDBObject("$meta" -> "textScore")))
.sort(orderBy = MongoDBObject("score" -> MongoDBObject("$meta" -> "textScore")))
Run Code Online (Sandbox Code Playgroud)
但是,我最终需要搜索多个条件并按其全文搜索分数对结果进行排序,因此我探索了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")))
Run Code Online (Sandbox Code Playgroud)
这给出了以下例外:
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)
.
.
Run Code Online (Sandbox Code Playgroud)
我之前看到过这个错误 - 当时我没有score在查询中包含该组件.但是一旦我这样做了,它就起作用了(如第一个代码片段所示),我认为查询构建器的版本是等效的.
就此而言,打电话来builder.result().toString()产生这个:
{ "$text" : { "$search" : "Vidya"} , "score" : { "$meta" : "textScore"}}
任何有助于让查询构建器为我工作的帮助将非常感激.
在您的工作查询中,您为"查询谓词"传递一个DBObject,为"字段"或"投影"传递第二个DBObject - find获取第二个可选参数,指示要返回哪些字段,并且在$ text搜索的情况下,有一个特殊投影字段$ meta,它允许您取回匹配文档的分数,以便您可以对其进行排序.
在构建器尝试中,您将投影DBObject添加到查询条件中,并且在您将分数组件省略为要查找的第二个参数时,您会看到之前看到的相同错误.
添加MongoDBObject("score" -> MongoDBObject("$meta" -> "textScore"))为第二个参数,以便像以前一样查找,并builder用于组合多个查询条件.
在简单的JSON术语中,您调用find是这样的:
db.coll.find( { "$text" : { "$search" : "Vidya"} , "score" : { "$meta" : "textScore"}} )
Run Code Online (Sandbox Code Playgroud)
当你真的想这样称呼它:
db.coll.find( { "$text" : { "$search" : "Vidya"} } , { "score" : { "$meta" : "textScore"}} )
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1670 次 |
| 最近记录: |