当前位置: 首页 > 知识库问答 >
问题:

scala mongodb在筛选器中的应用

阎宝
2023-03-14

我一直在为Scala mongo驱动程序中的MongoDB的过滤器而苦苦挣扎。我正在尝试获取集合中的所有文档,其中文档中的特定字符串位于字符串列表中。我在Scala中创建一个字符串列表,然后使用in操作符构建查询:

val find3 = in(EventItem, ListDelayedItems.toList)
public static <TItem> Bson in(String fieldName,
                              TItem... values)
public static <TItem> Bson in(String fieldName,
                              Iterable<TItem> values)
in(EventItem, "ABCDE", "DEF", "ESO4SAP")

它起作用了。这是我在打印in运算符筛选器时看到的结果

Operator Filter{fieldName='billing_event.action.resources.item', operator='$in', value=[ABCDE, DEF, ESO4SAP]}

但是当我试图在第二个参数中传递一个列表来使用第二个重载的方法时,它就不起作用了。我试图用来过滤的列表是动态的。我尝试过scala列表、ListBuffers、java.util.Lists,但每次我都使用这样的变量:

in(EventItem, ListValidItems)

它就停止工作了。我将ListValidItems定义为我所知道的每个集合,但当我看到日志时,我会看到以下内容:

Operator Filter{fieldName='billing_event.action.resources.item', operator='$in', value=[List(ABCDE, EFGH, ESO4SAP)]}

因此,它从value=[ABCDE,DEF,ESO4SAP]变为value=[LIST(ABCDE,EFGH,ESO4SAP)],过滤器不工作。

正如我提到的,我尝试了很多不同的列表,尝试了list.ToIterator,但似乎没有任何东西可以将列表数据结构转换为一个值列表titem...或可迭代

这是mongoDB驱动程序的导入列表

import org.mongodb.scala.connection.ClusterSettings
import com.mongodb.BasicDBObject
import com.mongodb.client.model.{FindOneAndReplaceOptions, FindOneAndUpdateOptions}
import org.mongodb.scala.ServerAddress
import org.mongodb.scala._
import org.mongodb.scala.bson.{BsonDocument, conversions}
import org.mongodb.scala.model.Filters._
import org.mongodb.scala.model.Updates._

谢谢!!

共有1个答案

皇甫卓君
2023-03-14

根据filters#in的签名,values参数是varargs。这就是它支持传递任意数量参数的语法的方式,如下所示:

scala> in(EventItem, "ABCDE", "DEF", "ESO4SAP")
res1: org.mongodb.scala.bson.conversions.Bson = Operator Filter{fieldName='EventItem', operator='$in',
value=[ABCDE, DEF, ESO4SAP]}

但是,在您的示例中,您有一个集合,例如Scala列表,您希望使用变量值构建该集合,然后传递给in。直接这样做,中的最终将解释为单个值,它是包含元素的列表本身。

scala> val ListValidItems = List("ABCDE", "DEF", "ESO4SAP")
ListValidItems: List[String] = List(ABCDE, DEF, ESO4SAP)

scala> in(EventItem, ListValidItems)
res2: org.mongodb.scala.bson.conversions.Bson = Operator Filter{fieldName='EventItem', operator='$in',
value=[List(ABCDE, DEF, ESO4SAP)]}

它需要一些额外的语法(ListValidItems:_*)来“展开”集合,以便将其单个元素作为varargs传递:

scala> in(EventItem, ListValidItems:_*)
res4: org.mongodb.scala.bson.conversions.Bson = Operator Filter{fieldName='EventItem', operator='$in',
value=[ABCDE, DEF, ESO4SAP]}

关于类型的Scala文档讨论了这一点,特别是关于归属的部分。

早些时候,您似乎试图从Scala代码中调用Java API,在您的question语句中存在Java方法签名就表明了这一点:

public static <TItem> Bson in(String fieldName,
                              TItem... values)

public static <TItem> Bson in(String fieldName,
                              Iterable<TItem> values)

如果您正在尝试这样做,那么您可以准备ListValidItems作为您选择的Scala集合,然后在传递给in之前转换为等效的Java集合。Java集合将实现Javaiterable接口。

最简单的方法是使用Scala中包含的javaconverters对象。如果您导入它,那么它将向集合类添加扩展方法以支持转换。下面是一个在repl中的演示。

scala> // Import converters.

scala> import collection.JavaConverters._
import collection.JavaConverters._

scala> // Create Scala List.

scala> val ListValidItems = List("ABCDE", "DEF", "ESO4SAP")
ListValidItems: List[String] = List(ABCDE, DEF, ESO4SAP)

scala> // Convert to Java List.

scala> val ListValidItemsConverted = ListValidItems.asJava
ListValidItemsConverted: java.util.List[String] = [ABCDE, DEF, ESO4SAP]

scala> // Prove that it is a Java Iterable.

scala> ListValidItemsConverted.asInstanceOf[java.lang.Iterable[java.lang.String]]
res8: Iterable[String] = [ABCDE, DEF, ESO4SAP]

有关更多详细信息,请参阅Scala指南和概述中的Java和Scala集合之间的转换。

 类似资料:
  • 我的spring boot应用程序配置为Reactive。但是我的REST APIendpoint配置为返回ResponseEntity而不使用Mono或flux。 我想实现过滤器,这将检查每个endpoint的传入头。旧的Servlet过滤器当然不起作用,新的WebFilter对webflux和其他过滤器也不起作用。

  • 我尝试在我的java play应用程序上启用CORS过滤器。我正在使用angularjs访问localhost以获取一些数据。这是我在play应用程序端所做的, 应用形态 过滤器。JAVA 当我试图打电话给我的服务时,它给了我一个错误, 无法加载XMLHttpRequesthttp://localhost:9000/app/search/0/10.对飞行前请求的响应未通过访问控制检查:请求的资源上

  • 正如您所看到的,它有一个构造函数,它可以得到过滤器列表,所以我可以根据需要从链中删除一个过滤器,其余的都可以正常工作。但是我不能为这样的构造函数在安全配置中创建bean。如果我使用 当然,它使用默认构造函数构建对象。好的,我试着用一些过滤器的列表来制作bean: 但这无法编译,因为BasicUserApprovalFilter是未知bean。那么如何从默认筛选器堆栈中排除一个筛选器呢?如果我用自定

  • 首先,我试图使选择所有复选框,如果我单击表头中的选择所有复选框,整个表行将选择并显示一个复选框反向消息,即我选择了多少复选框。这里的问题是,如果我单击select all复选框,反向消息不会显示楼上的表,即我选择了多少行。 其次,如果我从任何列中筛选任何数字,相同的数字将显示同一列中有多少行具有相同的数字。如果我选中了所有复选框,那么反向消息将显示我选中了多少行复选框。这里,问题是显示整个表行计数

  • 有什么建议吗?

  • 筛选器。 Usage 全部引入 import { Picker } from 'beeshell'; 按需引入 import Picker from 'beeshell/dist/components/Picker'; Examples Code import { Picker } from 'beeshell'; <Picker ref={(c) => { this._pick