我认为应该有一个简单的解决方案,但我无法找到它。
我开始使用Scala中的以下内容从MongoDB访问数据:
val search = MongoDBObject("_id" -> new ObjectId("xxx"))
val fields = MongoDBObject("community.member.name" -> 1, "community.member.age" -> 1)
for (res <- mongoColl.find(search, fields)) {
var memberInfo = res.getAs[BasicDBObject]("community").get
println(memberInfo)
}
并获得一个BasicDBObject作为结果:
{
"member" : [
{
"name" : "John Doe",
"age" : "32",
},{
"name" : "Jane Doe",
"age" : "29",
},
...
]
}
我知道我可以使用getAs [String]访问值,虽然这在这里不起作用... 有人有想法吗?寻找几个小时的解决方案......
答案 0 :(得分:2)
如果使用复杂的MongoDB对象,可以使用Salat,它提供简单的案例类序列化。
样本包含您的数据:
case class Community(members:Seq[Member], _id: ObjectId = new ObjectId)
case class Member(name:String, age:Int)
val mongoColl: MongoCollection = _
val dao = new SalatDAO[Community, ObjectId](mongoColl) {}
val community = Community(Seq(Member("John Doe", 32), Member("Jane Doe", 29)))
dao.save(community)
for {
c <- dao.findOneById(community._id)
m <- c.members
} println("%s (%s)" format (m.name, m.age))
答案 1 :(得分:0)
我想你应该试试
val member = memberInfo.as[MongoDBList]("member").as[BasicDBObject](0)
println(member("name"))
答案 2 :(得分:0)
这个问题与MongoDB无关,而是与您的数据结构有关。您的JSON / BSON数据结构包括
您的问题完全等同于以下内容:
case class Community(members:List[Member])
case class Member(name:String, age:Int)
val a = List(member1,member2)
// a.name does not compile, name is a property defined on a member, not on the list
答案 3 :(得分:0)
是的,你可以通过理解来完美地完成这项工作。您可以执行以下操作:
for { record <- mongoColl.find(search,fields).toList
community <- record.getAs[MongoDBObject]("community")
member <- record.getAs[MongoDBObject]("member")
name <- member.getAs[String]("name") } yield name
这只是为了获得名称。为了得到多个值,我想你会这样做:
for { record <- mongoColl.find(search,fields).toList
community <- record.getAs[MongoDBObject]("community")
member <- record.getAs[MongoDBObject]("member")
field <- List("name","age") } yield member.get(field).toString