2

ドキュメントをフェッチしてその属性を取得しようとしています。findOne メソッドを使用すると、MongoDBObject が取得されるはずですが、Option[com.mongodb.DBObject] が返されます。そこから属性を取得する方法は?これの代わりに MongoDBObject を取得することは可能ですか?

scala> var col = MongoClient()("test")("counters")
col: com.mongodb.casbah.MongoCollection = MongoCollection({ "_id" : "some" , "value" : 0})

scala> var doc = col.findOne()
doc: Option[com.mongodb.DBObject] = Some({ "_id" : "some" , "value" : 0})

scala> doc("_id")
<console>:13: error: Option[com.mongodb.DBObject] does not take parameters
              doc("_id")
                 ^
scala>
4

3 に答える 3

2

Casbah API はデータベースの内容を認識していないため、要求しているレコードが実際に存在するかどうかを確認できません。Java では、このようなメソッドは単純に を返すことができるオブジェクトを返しますnullOption[T]より安全な型を優先するため、これは Scala では推奨されません。このようにして、オブジェクトが存在しない状況を処理する必要があります。そのための構文がいくつかあります(最悪から最高まで:

オブジェクトが存在することが確実な場合 - そうでない場合は例外がスローされます

col.findOne().get

両方のケースを処理したい場合:

col.findOne() match {
  case Some(r) => //r is your record
  case None => //record didn't exist
}

レコードに対して特定の操作を実行する場合 (モナド スタイル)

col.findOne().map(r => r("_id")).foreach(println)

上記のコードは、_idそのようなレコードが見つかった場合にのみ列を出力し、それ以外の場合は何もしません。

于 2013-02-17T10:23:13.523 に答える
1

検索しようとしているオブジェクトがデータベースにない可能性があるため、Option[DBObject]を取得します。

matchコンストラクトで処理できます。

col.findOne() match{
  case Some(doc) => doc("id")
  case None => // not found
}
于 2013-02-17T10:20:11.343 に答える
1

Option[DBObject]何も見つからない可能性があり、一般にscala(およびその他の関数型言語)でnullを返さないようにしたいため、を取得します。結果に基づいて行動する方法はいくつかあります。単純に結果を取得するには、クエリからget取得した場合に例外をスローするを呼び出すことができNoneます。次にgetOrElse、呼び出しに渡す必要のある結果またはデフォルト値のいずれかを取得するために使用できるがあります。そして、がありorNullます。これは、結果がない場合は結果またはnullを返します。foreach結果を使用して副作用を作成する場合、またはmap特定の値を取得getOrElseして結果のオプションを呼び出す場合は、を使用することもできます。

于 2013-02-17T10:20:24.917 に答える