我正在使用Scala和Mongoldb-Casbah,我得到了一些数据:
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)
}
但它不会返回单个值,除非我让它变得更复杂。我没有尝试过findMap
或collectFirst
。
知道如何从该数据中提取一个myValue
吗?
答案 0 :(得分:0)
例如,如果您有以下文档:
{
"_id": ObjectId(...),
"item": "A",
"prices": [ {},{"myValue": 1}, {"myValue": 4}, {} ]
},
{
"_id": ObjectId(...),
"item": "B",
"prices": [ {"myValue": 7}, {}, {"myValue": 9}, {} ]
}
如果您想提取一个非空的myValue
元素,则可以使用$elemMatch投影运算符。 $elemMatch
运算符将查询结果中的数组字段的内容限制为仅包含与$elemMatch
条件匹配的第一个元素。
作为在scala / casbah中执行此操作的示例:
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} ] }
以上测试用:MongoDB v3.2,Scala v2.11.7,Casbah v3.1.0。