2014-04-14 17 views
2

我在處理應用程序中的BSONDocuments的可選值時遇到困難。我從Typesafe activator的「最終」模板開始(play/reactivemongo/angular)。我創建代表對象進入蒙戈的情況下類,以及一些值是選項:處理BSONDocument中的可選值

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

我遇到的問題是,可選的值越來越寫入蒙戈爲數組。出於示例目的,使用「Acme」作爲製造商,88作爲minPrice和None作爲maxPrice。 Printjson在蒙戈表明,這看起來像

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

創建從數據庫中值的對象的時候,我不能讀回從蒙戈數組值作爲一個簡單的期權價值。

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

這getAs()語句總是返回無,但bsondoc.get( 「minPrice」)確實有一些價值(BSONDocument())

我打印的數據被髮送到蒙戈的更新,當然,創建修飾語句的代碼將以數組的形式發送可選值,該數組可以是空的,也可以包含一個元素。

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) 
    } 
} 

可選的值沒有一個數組。如果他們沒有,他們不會出現。這對我的應用程序來說工作得很好,但是有些東西正在改變應用程序內部可選元素的BSONDocument處理。有誰知道爲什麼?

+1

我在調試中做了足夠的跟蹤,以確定在創建包含名稱和值的Tuple2後,匿名函數調用BSON雙處理函數,然後調用collectionToBSONArrayCollectionWriter。我看不到該函數中的代碼,因此很難說出發生了什麼。 – Willard

+0

你使用什麼版本的ReactiveMongo? –

+0

@Willard好奇,如果你找到解決方案,因爲我遇到同樣的問題? – shuttj

回答

1

以供將來參考,我發現這是怎麼回事,因爲我有以下隱含的進口:

import reactivemongo.bson.Producer.nameValue2Producer 

當我刪除的進口,它的工作如我所料

使用反應蒙戈版本0.10.5.0 .akka23。