2

オプションの値がアプリケーションで BSONDocuments によって処理される方法に問題があります。Typesafe アクティベーター (play/reactivemongo/angular) の「最終的な」テンプレートから始めました。Mongo に入るオブジェクトを表すケース クラスを作成しました。値の一部は Options です。

case class Item(
   id: Option[BSONObjectID],
   manufacturer: String,
   minPrice: Option[Double],
   maxPrice: Option[Double])

私が抱えている問題は、オプションの値が配列として Mongo に書き込まれていることです。たとえば、メーカーとして「Acme」、minPrice として 88、maxPrice として None を使用します。MongoのPrintjsonは、これが次のように見えることを示しています

{
    _id = BSONObjectID("...")
    manufacturer: "Acme",
    maxPrice: [ ],
    minPrice: [
       88
    ]
}

データベース値からオブジェクトを作成するときに、Mongo から配列値を単純なオプション値として読み取ることができません。

Item(
   ....
   bsondoc.getAs[Double]("minPrice"),
   ....
)

その getAs() ステートメントは常に None を返しますが、bsondoc.get("minPrice") には値 Some(BSONDocument()) があります

更新のために Mongo に送信されるデータを出力したところ、確かに、修飾子ステートメントを作成するコードは、オプションの値を空または 1 つの要素を含む配列として送信しています。

val modifier = BSONDocument(
    "$set" -> BSONDocument(
      "manufacturer" -> manufacturer,
      "minPrice" -> minPrice,
      "maxPrice" -> maxPrice
    ))

これは次のようにきれいに印刷されます

{
  $set: {
    manufacturer: BSONString(Acme),
    maxPrice: [

    ],
    minPrice: [
      0: BSONDouble(88.0)
    ]
  }
}

これらのオプションの値を処理する正しい方法はありますか?

謎に追加するために、同じ修飾子作成コードをワークシート (Eclipse 内) に配置すると、別の結果が得られます。

{
   $set: {
      manufacturer = BSONString(Acme),
      minPrice = BSONInteger(88)
   }
}

オプションの値には配列がありません。none の場合は表示されません。これは私のアプリケーションでは問題なく機能しますが、何かがアプリケーション内のオプション要素の BSONDocument 処理を変更しています。誰かが理由を知っていますか?

4

1 に答える 1