Mongoldb-Casbah:获得一个系列的第一场比赛

时间:2016-02-23 19:27:39

标签: mongodb scala casbah

我正在使用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)
    }

但它不会返回单个值,除非我让它变得更复杂。我没有尝试过findMapcollectFirst

知道如何从该数据中提取一个myValue吗?

1 个答案:

答案 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。