MongoDB+;Scala:访问深层嵌套数据
我认为应该有一个简单的解决办法,但我没能找到 我开始在Scala中通过以下方式从MongoDB访问数据:MongoDB+;Scala:访问深层嵌套数据,mongodb,scala,nested,casbah,Mongodb,Scala,Nested,Casbah,我认为应该有一个简单的解决办法,但我没能找到 我开始在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
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)
}
我知道我可以使用getAs[String]访问值,尽管这在这里不起作用。。。
有人有主意吗?花了几个小时寻找解决方案…我想你应该试试
val member = memberInfo.as[MongoDBList]("member").as[BasicDBObject](0)
println(member("name"))
如果您使用复杂的MongoDB对象,可以使用,它提供简单的case类序列化。
使用您的数据进行示例:
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))
case类社区(成员:Seq[Member],\u id:ObjectId=newobjectid)
案例类成员(名称:String,年龄:Int)
val mongoColl:MongoCollection=_
val dao=新SalatDAO[社区,目标](mongoColl){}
val社区=社区(序号(成员(“约翰·多伊”,32),成员(“简·多伊”,29)))
dao.save(社区)
为了{
c这个问题实际上与MongoDB无关,而是与您的数据结构有关
- 对象社区,包括
- 一组成员
- 每个成员都有属性名称或年龄
您的问题完全等同于以下问题:
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
for { record <- mongoColl.find(search,fields).toList
community <- record.getAs[MongoDBObject]("community")
member <- record.getAs[MongoDBObject]("member")
name <- member.getAs[String]("name") } yield name
是的,你可以通过理解完美地做到这一点。你可以做到以下几点:
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
for { record <- mongoColl.find(search,fields).toList
community <- record.getAs[MongoDBObject]("community")
member <- record.getAs[MongoDBObject]("member")
name <- member.getAs[String]("name") } yield name
用于{记录听起来很有趣。你能提供一个简短的例子来处理更深层次的嵌套数据吗?这看起来很有希望,结构清晰。从长远来看,我会去做。但为了解决我的紧迫问题,anoopelias的回答很简短。我想更新你的帖子,但我必须先获得一些声誉…我会为你做一个任务r稍后再说!:-)再次感谢!我怀疑有一个不太详细的解决方案。你可以尝试memberInfo.as[MongoDBList](“member”).as(0)
,看看它是否可以推断出类型。另外,从长远来看,salat是一个不错的解决方案。它是casbah上的一个优雅包装器。