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

时间:2013-03-15 04:56:24

标签: 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)) {
    var memberInfo = res.getAs[BasicDBObject]("community").get
    println(memberInfo)
}

并获得一个BasicDBObject作为结果:

{
"member" : [
    {
        "name" : "John Doe",
        "age" : "32",
    },{
        "name" : "Jane Doe",
        "age" : "29",
    },
    ...
]
}

我知道我可以使用getAs [String]访问值,虽然这在这里不起作用... 有人有想法吗?寻找几个小时的解决方案......

4 个答案:

答案 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