MongoDB+;Scala:访问深层嵌套数据

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

我认为应该有一个简单的解决办法,但我没能找到

我开始在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)
}
我知道我可以使用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上的一个优雅包装器。