使用Scala/Casbah从mongodbobject中提取值
我想从Casbah的MongoCollectionBase.find(…)返回的DBObject中提取某个键的值,在本例中为“orderItems”。我有解决办法,但我不满意。我发现我的解决方案很麻烦。它在每一步都将从DBObject.toMap返回的java.util.Map转换为Scala Map或其他集合。最好的方法是什么?谢谢使用Scala/Casbah从mongodbobject中提取值,scala,mongodb,casbah,Scala,Mongodb,Casbah,我想从Casbah的MongoCollectionBase.find(…)返回的DBObject中提取某个键的值,在本例中为“orderItems”。我有解决办法,但我不满意。我发现我的解决方案很麻烦。它在每一步都将从DBObject.toMap返回的java.util.Map转换为Scala Map或其他集合。最好的方法是什么?谢谢 val orders = provisioningDb("systems").find(MongoDBObject.empty, MongoDBObject("c
val orders = provisioningDb("systems").find(MongoDBObject.empty, MongoDBObject("company.department.orders" -> 1))
import scala.collection.JavaConversions._
def findC(m : Map[String, Any]) : Iterable[Any] = {
val c = for ((k, v) <- m) yield (k, v) match {
case (k, v) if k equals "orderItems" => v
case (k, v : java.util.HashMap[String, Any]) => findC(toMap(v).asInstanceOf[Map[String, Any]]).head
case _ => Nil
}
c.filter(_.isInstanceOf[java.util.List[Any]] )
}
def toMap[K, E](m: java.util.Map[K, E]): Map[K, E] = {
Map.empty ++ new MapWrapper[K, E](m)
}
val orderItems = for {
x <- orders
} yield x
for (y <- orderItems) {
println(findC(toMap(y.toMap).asInstanceOf[Map[String, Any]]))
}
您是否尝试过将
案例类与一起使用
您还可以查看这张很棒的幻灯片,特别是关于SalatDAO的幻灯片,它允许您直接持久化和检索案例对象
company : {department : {orders -> [{"id" : "543", "quantity" : 2}, {"id" : "223", "quantity" : 21}, {"id" : "332", "quantity" : 3}]
company : {department : {orders -> [{"id" : "222", "quantity" : 8}, {"id" : "663", "quantity" : 3]