2015-08-24 5 views
1

У меня есть следующий документ в MongoDBКак извлечь вложенный документ в 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 значение, пожалуйста, помогите мне, и где я делаю неправильно, пожалуйста, руководство меня

ответ

1

Используйте следующий код:

val cursor=collection.find() 
    var obj=new BasicDBObject 
    while(cursor.hasNext) 
    { 
     obj=cursor.next().asInstanceOf[BasicDBObject] 
     val artShare:BasicDBObject = obj.get("ArtShare").asInstanceOf[BasicDBObject] 
      log.info("TotalArtShares"+artShare.getString("TotalArtShares") 
     ) 

Сначала мы получаем вложенный объект, как BasicDBObject, а затем получить вещи из него.

+0

благодарю вас за работу – swaheed

1

Я не В настоящее время у Scala есть что-то для 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 обрабатывает встроенные данные внутренне и не обязательно переводит выбранный вами язык как средство доступа к возвращенным структурам данных в репсонах.

Когда вещи возвращаются в качестве нативных объектов, то это зависит от того, как язык управляет ими, и такие вещи, как «точечная нотация», больше не применяются, если вы не обрабатываете запросы.

1

Я предполагаю, что вы используете драйвер Java MongoDB из Скале,

val cursor=collection.find(new BasicDBObject("ArtShare.TotalArtShares", 0)) 
    var obj: BasicDBObject= _ 

    while(cursor.hasNext) { 
    obj = cursor.next().asInstanceOf[BasicDBObject] 

    val artShare = obj.get("ArtShare").asInstanceOf[BasicDBObject] 
    val id = artShare.getInt("TotalArtShares") 
    log.info("TotalArtShares " + id) 

    } 

Первое утверждение запроса, а затем в цикле в то время как я получить встроенный документ «ArtShare» и получить поле «TotalArtShares».

Я бы порекомендовал вам использовать cashbah, который представляет собой оболочку scala, построенную поверх java-драйвера, и выставляет scala api.

+0

Я использую cashbah – swaheed

+0

Мне нужно получить весь документ, поэтому мне нужно найти() не найти (новый BasicDBObject («ArtShare.TotalArtShares», 0)) в любом случае, спасибо за помощь – swaheed

+0

, эта инструкция запроса вернет вас весь документ, но этот документ должен соответствовать этим критериям, это эквивалентно вашему javascript-коду. Из этого кода я вижу только, что вы используете java api, я не вижу здесь casbah api. – grotrianster

Смежные вопросы