在Lift中定义一个MongoRecord,里面有一个Map

时间:2012-02-22 14:00:15

标签: scala mongodb lift

我找不到在Lift - MongoRecord中定义MongoRecord里面有Map[String,String]字段的方法。

Lift文档说:

  

支持所有标准记录字段。还支持Mongo特定类型; ObjectId,UUID,Pattern,List和Map。

如何定义地图和列表字段?

2 个答案:

答案 0 :(得分:4)

我定义了一个BsonRecordMapField:

class BsonRecordMapField[OwnerType <: BsonRecord[OwnerType], SubRecordType <: BsonRecord[SubRecordType]]
(rec: OwnerType, valueMeta: BsonMetaRecord[SubRecordType])(implicit mf: Manifest[SubRecordType])
  extends MongoMapField[OwnerType, SubRecordType](rec: OwnerType) {

  import scala.collection.JavaConversions._

  override def asDBObject: DBObject = {
    val javaMap = new HashMap[String, DBObject]()
    for ((key, element) <- value)  {
      javaMap.put(key.asInstanceOf[String], element.asDBObject)
    }
    val dbl = new BasicDBObject(javaMap)
    dbl
  }

  override def setFromDBObject(dbo: DBObject): Box[Map[String, SubRecordType]] = {
    val mapResult: Map[String, SubRecordType] = (for ((key, dboEl) <- dbo.toMap.toSeq) yield (key.asInstanceOf[String], valueMeta.fromDBObject(dboEl.asInstanceOf[DBObject]))).toMap
    setBox(Full(mapResult))
  }


  override def asJValue = {
    val fieldList = (for ((key, elem) <- value) yield JField(key, elem.asJValue)).toList
    JObject(fieldList)
  }

  override def setFromJValue(jvalue: JValue) = jvalue match {
    case JNothing | JNull if optional_? => setBox(Empty)
    case JObject(fieldList) => val retrievedMap = fieldList.map {
      field =>
        val key = field.name
      val valRetrieved = valueMeta.fromJValue(field.value) openOr valueMeta.createRecord
      (key, valRetrieved)
    }.toMap
    setBox(Full(retrievedMap))
    case other => setBox(FieldHelpers.expectedA("JObject", other))
  }
}

这是对Rogue的隐式查询:

class BsonRecordMapQueryField[M <: BsonRecord[M], B <: BsonRecord[B]](val field: BsonRecordMapField[M, B])(implicit mf: Manifest[B]) {

  def at(key: String): BsonRecordField[M, B] = {
    val listBox = field.setFromJValue(JObject(List(JField("notExisting", JInt(0)))))
    val rec = listBox.open_!.head._2
    new BsonRecordField[M, B](field.owner, rec.meta)(mf) {
      override def name = field.name + "." + key
    }
  }
}

object ExtendedRogue extends Rogue {
  implicit def bsonRecordMapFieldToBsonRecordMapQueryField[M <: BsonRecord[M], B <: BsonRecord[B]](f: BsonRecordMapField[M, B])(implicit mf: Manifest[B]): BsonRecordMapQueryField[M, B] = new BsonRecordMapQueryField[M, B](f) (mf)


}

您现在可以在地图中使用at运算符。

答案 1 :(得分:0)

MongoMapField怎么办?