Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在Lift中定义MongoRecord,并在其内部定义地图_Scala_Mongodb_Lift - Fatal编程技术网

Scala 在Lift中定义MongoRecord,并在其内部定义地图

Scala 在Lift中定义MongoRecord,并在其内部定义地图,scala,mongodb,lift,Scala,Mongodb,Lift,我找不到在Lift-MongoRecord中使用Map[String,String]字段定义MongoRecord的方法 电梯文件说明: 支持所有标准记录字段。还支持Mongo特定的类型;ObjectId、UUID、模式、列表和映射 如何定义映射和列表字段?我定义了一个BsonRecordMapField: class BsonRecordMapField[OwnerType <: BsonRecord[OwnerType], SubRecordType <: BsonRecord[

我找不到在Lift-MongoRecord中使用Map[String,String]字段定义MongoRecord的方法

电梯文件说明:

支持所有标准记录字段。还支持Mongo特定的类型;ObjectId、UUID、模式、列表和映射


如何定义映射和列表字段?

我定义了一个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运算符。

我定义了一个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运算符。

关于什么?

关于什么?

这是您想要的吗?不,但是对象的映射,我在下面的答案中定义了它。这是您想要的吗?不,但是对象的映射,我在下面的答案中定义了它。我正在使用Rogue,并且MongoMapField未正确支持运算符的值。我构建的解决方案具有BSONRecordListField的所有优点和功能。我使用的是Rogue和MongoMapField,但operator不支持正确的值。我构建的解决方案具有BSonRecordListField的所有优点和功能。您能举一个关于at的恶意查询的例子吗?谢谢你。这真的很方便,谢谢你做了困难的部分!我将工作示例放在github上:您能给出一个关于at的恶意查询的示例吗?谢谢你。这真的很方便,谢谢你做了困难的部分!我将工作示例放在github上: