あなたにとってうまくいくかもしれないのは、データをJValue
ではなくとして保存することですString
。JsonObjectField
を含むケース クラスのラッピングを使用できますJValue
。これにより、任意の構造が可能になりますが、Mongo で追加レベルのネストが可能になります。それを回避するには、? を保持するためだけにカスタム フィールドを作成するのはJValue
どうですか?
それを一刺し:
abstract class JValueObjectField[OwnerType <: BsonRecord[OwnerType]](rec: OwnerType)
extends Field[JValue,OwnerType]
with MandatoryTypedField[JValue]
with MongoFieldFlavor[JValue] {
def owner = rec
def defaultValue = JNothing
def toForm: Box[NodeSeq] = Empty
implicit val formats = owner.meta.formats
def asJValue: JValue = valueBox openOr JNothing
def setFromJValue(jv: JValue): Box[JValue] = Full(jv)
def setFromString(in: String): Box[JValue] = tryo(JsonParser.parse(in)) match {
case Full(jv: JValue) => setFromJValue(jv)
case f: Failure => setBox(f)
case other => setBox(Failure("Error parsing String into a JValue: "+in))
}
def setFromAny(in: Any): Box[JValue] = in match {
case dbo: DBObject => setFromDBObject(dbo)
case value: JValue => setBox(Full(value))
case Some(value: JValue) => setBox(Full(value))
case Full(value: JValue) => setBox(Full(value))
case (value: JValue) :: _ => setBox(Full(value))
case s: String => setFromString(s)
case Some(s: String) => setFromString(s)
case Full(s: String) => setFromString(s)
case null|None|Empty => setBox(defaultValueBox)
case f: Failure => setBox(f)
case o => setFromString(o.toString)
}
def asDBObject: DBObject = JObjectParser.parse(asJValue.asInstanceOf[JObject])
def setFromDBObject(dbo: DBObject): Box[JValue] =
setFromJValue(JObjectParser.serialize(dbo))
}
...これは多くのように見えます: 私が行ったのはJValueObjectField
、1 つのパラメーターを削除して で修正したからカット アンド ペーストしたことだけJValue
です。それを行うためのよりスマートな方法があるかもしれません。
これをモデルで使用できます。
object data extends JValueObjectField(this)
lift-json DSLを使用して入力します。
val json = ("name" -> "Bob") ~ ("result" -> 1)
Recording.createRecord.data(json).save
これにより、MongoDB ドキュメントに次のようなものが表示されます。
"data" : {
"name" : "Bob",
"result" : 1
}
ところで、Lift のメーリング リストは、より良い回答を得るための良い方法です。たまたま、Lift 関係者のほとんどがここに集まっているようです。