2017-07-21 57 views
1

我一直在使用Scala mongo驅動程序中的MongoDB過濾器。我試圖獲取集合中文檔中的特定字符串位於字符串列表中的所有文檔。我創建斯卡拉字符串列表,然後我建立與IN操作符的查詢:scala mongodb 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) 

的問題是,我不知道如何構造Iterable值。如果我將值作爲值列表傳遞(請參閱第一種重載方法),

in(EventItem, "ABCDE", "DEF", "ESO4SAP") 

它有效。這是我所看到的,當我打印在運營商過濾

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)]} 

所以從 值=改變[ABCDE,DEF,ESO4SAP]價值= [列表(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._ 

任何想法?

謝謝!

回答

0

根據Filters#in的簽名,values參數爲可變參數。這是怎麼回事支持語法傳遞的參數的任意數量的,就像這樣:

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

然而,在你的情況,你有一個集合,如Scala的List,要與變量值建立,然後傳遞給in。直接這樣做,in最終將values解釋爲單個值,即包含元素的List本身。

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:_*)以「展開」收集傳遞它的各個元素作爲可變參數:

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

Types討論這一點,特別是在Ascription部分斯卡拉文檔。

早些時候,似乎您試圖調用從Scala代碼中的Java API,由Java方法簽名的存在表明您的問題聲明:

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

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

如果這是你想要什麼那麼你可以準備ListValidItems作爲你選擇的Scala集合,然後轉換爲等效的Java集合,然後傳遞給in。 Java集合將實現Java Iterable接口。

最簡單的方法是使用包含在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] 

有關詳細信息,請參閱Conversions Between Java and Scala CollectionsScala Guides and Overviews

+0

我剛試過。我現在得到的是一個元素的列表,元素是列表 運算符篩選{fieldName ='billing_event.action.resources.item',operator ='$ in',value = [[ABCDE,EFGH, ESO4SAP]} 過濾器失敗,因爲它不是[ABCDE,EFGH,ESO4SAP],而[ABCDE,EFGH,ESO4SAP] – AndoverDev

+0

你能請更新您的問題,列出了所有的'import'聲明對於'com.mongodb'下的任何東西? –

+0

爲mongoDB驅動添加了所有進口 謝謝! – AndoverDev