2

私は次のモデルを持っています

class Recording private() extends MongoRecord[Recording] with ObjectIdPk[Recording] {

    def meta = Recording

    object data extends StringField(this, 50)

}

現在、Jsonオブジェクトを「データ」フィールドに文字列として保存しています。以前はJsonObjectフィールドを使用していましたが、事前定義されたオブジェクト構造のみを使用していました。この場合、保存される json オブジェクトは任意の構造またはデータ フィールドを持つことができるため、定義済みのデータ構造はオプションではありません。

私が持っているとしましょう:

{"name" : "James", "value" : "Hai!"}

または

{"result" : 1, "handle" : "lorem_ipsum"}

両方をjsonオブジェクトとして同じフィールド「データ」に保存できる必要があります。

これを行う方法はありますか?

助けてくれてありがとう、どうもありがとう:)

4

2 に答える 2

0

あなたにとってうまくいくかもしれないのは、データをJValueではなくとして保存することですStringJsonObjectFieldを含むケース クラスのラッピングを使用できます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 関係者のほとんどがここに集まっているようです。

于 2013-07-31T19:04:47.507 に答える