2011-05-24 73 views
1

我的文件看起來是這樣的:如何通過casbah獲取文檔密鑰?

{ 
    "dynamic_field" : "...", 
    "another_dynamic_field" : "..." 
    "yet_another_dynamic_field" : "..." 
} 

「動力場」的意思是我不知道它的名字做。所以我想獲得這個文件的關鍵字的字符串集合。然後通過鍵來獲取文檔的值(值的結構已被很好地定義)。

於是,我試着做以下

val dbObject = ... 
val keys = dbObject.keys() 
for(
    key <- keys; /java.lang.ClassCastException: com.mongodb.BasicDBList cannot be cast to scala.collection.Seq at this line 
    val value = dbObject.as[String](key)/
) yield new MyClass(key, value) 

有什麼建議?

回答

1

我不知道,只要你的施法去什麼破有,但要確保你有正確的implicits範圍:

import com.mongodb.casbah.Imports._ 

我不知道在所有的地方說:「BasicDBList」即將到來從,但我認爲你太過複雜了。只要蘊含在範圍內,您可以直接將DBObject視爲Scala對象。這意味着您可以立即迭代其鍵和值:

scala> val doc = conn("worldDevelopmentIndicators.in").findOne().get 
doc: com.mongodb.DBObject = { "_id" : "4ddab3c62511cea643f3e5a0" , "SeriesCode" : "AG.AGR.TRAC.NO" , "Series Name" : "\"Agricultural machinery" , "Country Code" : " tractors\"" , "Country Name" : "AFG" , "1960" : "Afghanistan" , "1962" : 120.0 , "1963" : 150.0 , "1964" : 200.0 , "1965" : 200.0 , "1966" : 300.0 , "1967" : 400.0 , "1968" : 500.0 , "1969" : 500.0 , "1970" : 550.0 , "1971" : 550.0 , "1972" : 600.0 , "1973" : 600.0 , "1974" : 585.0 , "1975" : 570.0 , "1976" : 550.0 , "1977" : 530.0 , "1978" : 515.0 , "1979" : 495.0 , "1980" : 450.0 , "1981" : 400.0 , "1982" : 350.0 , "1983" : 300.0 , "1984" : 250.0 , "1985" : 200.0 , "1986" : 150.0 , "1987" : 150.0 , "1988" : 120.0 , "1989" : 120.0 , "1990" : 120.0 , "1991" : 120.0 , "1992" : 120.0 , "1993" : 110.0 , "1994" : 110.0 , "1995" ... 

for ((k,v) <- doc) println(k) 
/* 
_id 
SeriesCode 
Series Name 
Country Code 
Country Name 
*/ 

// you also have the value in this iteration in V... 
scala> for (kv <- doc) println(kv) 
(_id,4ddab3c62511cea643f3e5a0) 
(SeriesCode,AG.AGR.TRAC.NO) 
(Series Name,"Agricultural machinery) 
(Country Code, tractors") 
(Country Name,AFG) 
(1960,Afghanistan)