2016-02-23 73 views
0

我使用Scala和Mongoldb-卡斯巴中,我也得到了一些數據具有:Mongoldb-卡斯巴:獲得第一場比賽的集合

val myData: Traversable[Imports.DBObject] = myCollection.find(query).toTraversable 

返回的數據是這樣的集合:

[ {_id:「...」, 價格:[ {myValue:「...」,...}, {myValue:「...」,...},... ] } , {... },... ]

我需要的是,它是第一個不是空的myValue

我嘗試不同的東西,如:

myData.foldLeft(List[Any]()) { (acc, v) => 
     acC++ v.get("prices").asInstanceOf[BasicDBList].filter(_.asInstanceOf[DBObject].getOrElse("myValue", "").toString.nonEmpty).take(1) 
    } 

但它沒有返回一個單一的值,除非我使它更加複雜。我沒有嘗試過findMapcollectFirst

任何想法如何從該數據中提取一個單一的myValue

回答

0

舉例來說,如果你有文件象下面這樣:

{ 
    "_id": ObjectId(...), 
    "item": "A", 
    "prices": [ {},{"myValue": 1}, {"myValue": 4}, {} ] 
}, 
{ 
    "_id": ObjectId(...), 
    "item": "B", 
    "prices": [ {"myValue": 7}, {}, {"myValue": 9}, {} ] 
} 

如果你想提取一個單一myValue元素不爲空,你可以利用$elemMatch投影算。 $elemMatch操作符將查詢結果中的數組字段的內容限制爲僅包含匹配$elemMatch條件的第一個元素。

作爲一個例子在階/卡斯巴做到這一點:MongoDB的V3.2,斯卡拉v2.11.7,卡斯巴V3.1.0:

val coll = MongoClient()("dbName")("collName") 

/* The query below is equivalent to db mongo shell 
    db.collName.find({item:"A"}, {prices: { $elemMatch: { myValue: {$exists:true} } } }) */ 

val elemMatch = "prices" $elemMatch MongoDBObject("myValue"-> MongoDBObject("$exists" -> true)) 
val query = MongoDBObject("item" -> "A") 

coll.find(query, elemMatch).foreach { doc => 
    println(doc) 
} 
// Output: { "_id" : { "$oid" : "..."} , "prices" : [ { "myValue" : 1.0} ] } 

上面用測試。