0

我认为应该有一个简单的解决方案,但我找不到它。

我开始在 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

4 回答 4

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))
于 2013-03-15T07:00:39.647 回答
0

我觉得你应该试试

val member = memberInfo.as[MongoDBList]("member").as[BasicDBObject](0)
println(member("name"))
于 2013-03-15T06:50:04.027 回答
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
于 2013-03-15T08:17:20.107 回答
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
于 2015-03-18T16:30:18.760 回答