Play Framework 2.6+Scala+ReactiveMongo $and查询日期范围报错求助
解决ReactiveMongo查询日期范围的错误问题
嘿,我来帮你搞定这个MongoDB查询的报错!你遇到的Can't canonicalize query: BadValue and needs an array错误,主要是三个问题导致的,我给你拆解一下,再给出正确的写法:
错误原因分析
- $and参数格式错误:MongoDB要求
$and的取值必须是条件数组,但你传了一个BSONDocument,这是最直接的报错原因。 - 重复键被覆盖:你在同一个BSONDocument里重复使用了
creationDate键,后面的$lte条件会覆盖前面的$gte,相当于只执行了一半的查询逻辑。 - 混合使用BSON和JSON类型:你把ReactiveMongo的
BSONDocument和Play的Json.obj混在一起用,虽然偶尔能工作,但容易引发类型不兼容的问题,最好统一用BSON类型。
正确的查询写法
方式一:无需显式使用$and(推荐)
MongoDB会自动对同一个字段的多个条件做逻辑与,所以可以直接把两个日期条件写在同一个creationDate的BSONDocument里:
import reactivemongo.bson.BSONDocument // 确保startDate和endDate是java.util.Date或兼容的日期类型(比如Joda DateTime) val query = BSONDocument( "creationDate" -> BSONDocument( "$gte" -> startDate, "$lte" -> endDate ) )
方式二:显式使用$and(复杂场景适用)
如果你的查询逻辑更复杂,需要显式用$and,记得给它传递一个BSON数组,每个元素是单独的条件文档:
import reactivemongo.bson.{BSONDocument, BSONArray} val query = BSONDocument( "$and" -> BSONArray( BSONDocument("creationDate" -> BSONDocument("$gte" -> startDate)), BSONDocument("creationDate" -> BSONDocument("$lte" -> endDate)) ) )
额外注意事项
- 确认
startDate和endDate的类型是MongoDB支持的日期类型(比如java.util.Date),ReactiveMongo会自动将它们转换为BSON日期类型。 - 如果你在使用ReactiveMongo的Play JSON集成模块,记得导入对应的转换包(
reactivemongo.play.json.compat.bson2json._),确保BSON和JSON类型能正确转换。
内容的提问来源于stack exchange,提问作者mohamedali10
相关产品推荐
相关产品推荐

