ReactiveMongo $ in运算符返回零元素

时间:2015-11-13 22:25:11

标签: mongodb scala reactivemongo

在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"),并运行查询则成功。因为我认为ListTraversable的后代?

,所以看起来很奇怪

3 个答案:

答案 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))