我在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/