java - 如何在mongodb中获取嵌套文档

标签 java mongodb scala

我在mongoDb中有如下文档

{
    "_id" : 0,
    "GroupUuid" : 0,
    "GroupActivationDate" : "2015-08-01T00:00:00.000+05:00",
    "PurchaseDate" : "2015-08-24T12:42:24.380+05:00",
    "GroupExpirationDate" : "2015-08-28T00:00:00.000+05:00",
    "HousefullDate" : "0001-01-01T01:01:00.000+04:28:12",
    "ArtShare" : {
        "TotalArtShares" : 0,
        "pricePerShare" : 0,
        "ArtworkUuid" : 12,
        "AvailableShares" : 0,
        "SoldShares" : 0
    }
}

当我这样做时 db.groupBuying.find({"ArtShare.TotalArtShares":0}).pretty() 以上文档显示

现在我想用我正在做的代码来做到这一点

val cursor=collection.find()
    var obj=new BasicDBObject
     while(cursor.hasNext)
     {
       obj=cursor.next().asInstanceOf[BasicDBObject]

       var id=obj.getString("ArtShare.TotalArtShares").toInt
       log.info("TotalArtShares "+id)
     }
   }

但是下面抛出异常

java.lang.NumberFormatException: null
    at java.lang.Integer.parseInt(Integer.java:542)
    at java.lang.Integer.parseInt(Integer.java:615)
    at scala.collection.immutable.StringLike$class.toInt(StringLike.scala:247)
    at scala.collection.immutable.StringOps.toInt(StringOps.scala:30)
    at models.groupbuyingmodels.groupbuyingMongoReadWrite.GroupBuyingStore.write(GroupBuyingStore.scala:43)
    at models.groupbuyingmodels.groupbuyingMongoReadWrite.GroupBuyingWriteMongoActor$$anonfun$receive$1.applyOrElse(GroupBuyingWriteMongoActor.scala:27)
    at akka.actor.Actor$class.aroundReceive(Actor.scala:465)
    at models.groupbuyingmodels.groupbuyingMongoReadWrite.GroupBuyingWriteMongoActor.aroundReceive(GroupBuyingWriteMongoActor.scala:15)
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)
    at akka.actor.ActorCell.invoke(ActorCell.scala:487)
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238)
    at akka.dispatch.Mailbox.run(Mailbox.scala:220)
    at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
13:08:55.166 1652348 [ArteciateActorSystem-akka.actor.GroupBuyingWriteMongoActor-dispatcher-6] controller ERROR - printStackTrace()

当我这样做的时候

var obj=new BasicDBObject
     while(cursor.hasNext)
     {
       //var cur=cursor.next()
       obj=cursor.next().asInstanceOf[BasicDBObject]

       var id=obj.getString("GroupUuid").toInt
       log.info("GroupUuid"+id)
     }
   }

然后 GroupUuid 的值被打印在控制台上 我怎样才能获取 TotalArtShares 值请帮助我,我哪里做错了请指导我

最佳答案

我现在对 Scala 没有任何准备,但是一般的 Java 技术是首先通过它的顶级键获取文档,然后从底层对象访问属性:

    MongoClient client = new MongoClient(new ServerAddress("192.168.2.4", 27017));
    MongoDatabase mongoDatabase = client.getDatabase("test");

    MongoCollection<Document> trash = mongoDatabase.getCollection("trash");
    MongoCursor<Document> cursor = trash.find().iterator();

    // { "_id" : ObjectId("55dad435d622c0483e94d3b2"), "something" : { "nested" : 1 } } 

    while ( cursor.hasNext() ) {
        Document doc = cursor.next();
        Document something = doc.get("something", Document.class);
        Double nested = something.getDouble("nested");
        System.out.println(nested);
    }

"dot notation"概念是 MongoDB 如何在内部处理嵌入式数据,并且不一定将您选择的语言翻译为访问响应中返回的数据结构的一种方式。

一旦事物作为 native 对象返回,那么它就取决于您如何操作它们的语言结构,并且“点符号”之类的东西不再适用,除非您正在构造查询。

关于java - 如何在mongodb中获取嵌套文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32177424/

相关文章:

java - Selenium Grid 将值并行发送到一个浏览器

javascript - Meteor 访问 MongoDB 很慢

node.js - Mongodb 按两个字段之一排序

scala - Play Framework for Scala - RESTful Web 服务

java - Android:从输入流定义图像类型(jpeg 或 jpeg2000)

初始化和实例化的Java顺序

java - JBoss Eclipselink 不在 postgresql 中的 create-tables/create-or-extend-tables 上创建索引

node.js - 在Windows中从.csv文件将数据导入mongodb数据库

regex - 从带有类型的字符串中提取 url

scala - 在一个模式中多次使用相同的变量