Scala 案例 class 不是 return 数据
Scala case class not return data
我在使用 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"]}]})
我不知道为什么我的 model
找到的方法不是 return tcpPorts
,它的值总是空列表,与 applications
相同?
这是一个简单的命名问题。您的模型对象指定 tcpPorts
和 applications
(复数),但您的 Mongo 文档具有 tcpPort
和 application
(单数)。修复一个或另一个,或者(不推荐,因为它会让您的手写查询很痛苦,但它可以解决您的直接问题)对每个字段使用 @Key
将单数映射到复数。
我在使用 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"]}]})
我不知道为什么我的 model
找到的方法不是 return tcpPorts
,它的值总是空列表,与 applications
相同?
这是一个简单的命名问题。您的模型对象指定 tcpPorts
和 applications
(复数),但您的 Mongo 文档具有 tcpPort
和 application
(单数)。修复一个或另一个,或者(不推荐,因为它会让您的手写查询很痛苦,但它可以解决您的直接问题)对每个字段使用 @Key
将单数映射到复数。