0

我在使用salat库的项目中使用了 mongoDB 和 scala,我的模型包含:

case class ApplicationGroupModel(
  @Key("_id") id: ObjectId,
  devicesData: List[ApplicationDevicesData]
  )
case class ApplicationDevicesData(
  hostId: Option[String],
  tcpPorts: List[Int] = List.empty,
  applications: List[String] = List.empty)
object ApplicationGroupModel extends ModelCompanion[ApplicationGroupModel, ObjectId] {

  val collection = ScalaMongoFactory.database(collectionName)
  val dao = new SalatDAO[ApplicationGroupModel, ObjectId](collection = collection) {}
  def apply(rawData: JsValue): ApplicationGroupModel = {
    val devicesDataList = getTcpData(rawData)
    ApplicationGroupModel(new ObjectId,devicesDataList)
  }

 private def getTcpData(rawData: JsValue): List[ApplicationDevicesData] = {
        //function body
        //return List of ApplicationDevicesData

  }

在控制器中,我将模型称为:

val allData = ApplicationGroupModel.findOneById(new ObjectId("556c23b244aef072afcb6d50")).toList

如果我打印allData它会显示以下输出:

ApplicationGroupModel(556c23b244aef072afcb6d50,List(ApplicationDevicesData(Some(127.0.0.1),List(),List()), ApplicationDevicesData(Some(127.0.0.1),List(),List()), ApplicationDevicesData(Some(localhost),List(),List()))))

但如果我model这样打电话:

val allData = ApplicationGroupModel.collection.findOneByID(new ObjectId("556c23b244aef072afcb6d50")).toList

并打印allData然后输出为:

List({ "_id" : { "$oid" : "556c23b244aef072afcb6d50"} ,  "devicesData" : [ { "hostId" : "127.0.0.1" , "tcpPort" : [ 80 , 22 , 443] ,   "application" : [ "ABC"]} , { "hostId" : "127.0.0.1" , "tcpPort" : [ 22] ,   "application" : [ "XYZ"]} , { "hostId" : "localhost" , "tcpPort" : [ 5000 , 4100 , 22 , 80] ,   "application" : [ "ABCD"]}]})

我不知道为什么我的modelfind 方法没有返回tcpPorts值,它总是空列表相同applications

4

1 回答 1

1

这是一个简单的命名问题。您的模型对象指定tcpPortsapplications(复数),但您的 Mongo 文档具有tcpPortapplication(单数)。修复一个或另一个,或者(不推荐,因为它会使您的手写查询很痛苦,但它可以解决您的直接问题)使用@Key每个字段将单数映射到复数。

于 2015-06-01T14:02:28.483 回答