在ReactiveMongo $in
查询中使用0.11
运算符时遇到问题。由于某种原因,查询返回零文档,但我可以确认ID存在。所以我假设我没有正确构建这个。
这是我的疑问:
val query = BSONDocument("userId" -> userId, "convoId" -> BSONDocument("$in" -> BSONArray(convoIds)))
collection.find(query).cursor[ChatDesc](ReadPreference.primaryPreferred).collect[List]()
我通过应用列表来构建我的BSONArray
:
BSONArray(List(id1, id2, ...))
以下是查询中使用的ID:
List(5594ee9f02fb36b06e2925b155ea043bfb006c5a6a8436be, 552c784430a54cf55e07190955ea043bfb006c5a6a8436be, 55af435c9524018461f750ec55ea043bfb006c5a6a8436be...)
如果我遗漏$in
运算符并手动检查每个convoIds
字段,我可以确认55af435c9524018461f750ec55ea043bfb006c5a6a8436be
以上的第3个ID实际上在集合中多次出现。此外,其他对象符合userId
字段的条件。
我唯一的猜测是我需要在字段上创建某种MongoDB二级索引吗?
不确定我做错了什么。谢谢!
我已将问题缩小到我应用BSONArray
的方式。如果我手动粘贴其中一个ID BSONArray("thestringID")
,并运行查询则成功。因为我认为List
是Traversable
的后代?
答案 0 :(得分:2)
请说明您使用的版本。
如果查看文档,可以看到BSONArray
可以从Traversable[BSONValue]
或Producer[BSONValue]
创建。
您的列表似乎是List[String]
,Traversable
但不是Traversable[BSONValue]
,这意味着它尝试将前一个构造函数应用于Producer[BSONValue]*
。< / p>
实际上,Producer[BSONValue]
的类型类List[String]
有一个实例,因为只要提供一个元素类型,就会有一个List
的实例(就是这种情况) String
)。这样的制作人自己创建BSONArray
。
因此,调用BSONArray(List("id1","id1"))
会产生BSONArray(BSONArray("id1","id2"))
,这有效,但对查询毫无意义。
答案 1 :(得分:0)
您不应该将BSONArray用于List,将List放在没有任何内容的BSONDocument中就足够了:
--automatic_restart=no
或在Play JSON库中:
val query = BSONDocument("userId" -> userId, "convoId" -> BSONDocument("$in" -> convoIds))
答案 2 :(得分:-1)
我不得不遍历列表,因为BSONArray
似乎不支持scala的原生List
。
var idFilter = BSONArray()
matchIds.foreach( id => idFilter = idFilter ++ id)
val query = BSONDocument("userId" -> userId, "convoId" -> BSONDocument("$in" -> idFilter))