在某些情况下 $in 运算符的条件问题(Kotlin)

问题描述 投票:0回答:1

以下查询不会返回任何结果:

val names = mutableListOf("toto")
Criteria().orOperator(
    mutableListOf(
        Criteria("fieldA.name").`in`(names),
        Criteria("fieldB.name").`in`(names)
    )
)

但我知道一些结果应该已经返回。此外,以下查询返回一些结果:

Criteria().orOperator(
    mutableListOf(
        Criteria("fieldA.name").`is`(names[0]),
        Criteria("fieldB.name").`is`(names[0])
    )
)

在日志中,我可以看到: 执行计数: { "$or" : [{ "fieldA.urn" : { "$in" : [["toto"]]}}, { "fieldB.urn" : { "$in" :集合中的[["toto"]]}}]}:字段

双括号对我来说似乎不“正常”。我相信这是一个错误。你能确认一下吗? 与 org.springframework.boot:spring-boot-starter-data-mongodb:2.7.9、org.springframework.data:spring-data-mongodb:3.4.8 和 org.mongodb:mongodb-driver-core:4.10 相同。 2

我尝试使用这个标准:

Criteria
    .where("fieldA.name").`in`(names)
    .orOperator(Criteria.where("fieldB.name").`in`(names))

但正如预期的那样,日志记录显示相同的 mongodb 查询。

谢谢, 瓦尔

kotlin spring-data-mongodb
1个回答
0
投票

Criteria
类为
$in
运算符提供了两个重载函数。这些是:

in(Object... values)
in(Collection<?> values)

一个采用可变参数,另一个采用值的集合。从查询日志中可以清楚地看出,您的调用正在解析为该函数的

varargs
版本,并且将您传递的参数视为一个列表元素。要解决此问题,您可以尝试将列表分散到可变参数,如下所示:

val names = mutableListOf("toto")
Criteria().orOperator(
    mutableListOf(
        Criteria("fieldA.name").`in`(*names.toTypedArray()),
        Criteria("fieldB.name").`in`(*names.toTypedArray())
    )
)
© www.soinside.com 2019 - 2024. All rights reserved.