2017-10-16 6 views
1

Je souhaite trouver la valeur de champ spécifique du sous-document mongo, mais en recherchant la valeur complète ou la valeur null. J'utilise le pilote mongo 3.0.1. Y at-il un problème avec la syntaxe pour le pilote spécifique mongo.
données JSON est:Comment obtenir une valeur spécifique à partir d'un sous-document dans mongo

{ 
     "Demo": { 
      "Demo Data": { 
       "Building": { 
        "A": 1, 
        "B": 2, 
        "C": 3, 
        "D": 4, 

       }, 
       "Mode": "Building" 
      } 
     } 
    } 

Le code est comme ci-dessous:

DBCollection collection = db.getCollection("demo"); 
        BasicDBObject field = new BasicDBObject(); 
        BasicDBObject document = new BasicDBObject(); 
        field1.put("_id", 0); 
        field1.put("Demo", 1); 
        DBCursor cursor = collection.find(document, field); 
        BasicDBObject object = new BasicDBObject(); 
        BasicDBObject Mode = new BasicDBObject(); 
        while (cursor.hasNext()) { 
         object = (BasicDBObject) cursor.next(); 
         Mode.put("Mode", object.get(Mode)); 
         System.out.println("Mode value is"+Mode); 

        } 

mais en utilisant code ci-dessus, la sortie montrant que:

Mode value is {"Mode":null} 

L'exigence est d'obtenir les éléments suivants sortie: {"Mode": "Building"}.

Veuillez spécifier où la condition s'est mal passée. Merci pour toute aide.

+0

Quelle version du pilote Java Mongo est utilisée? –

+0

@CS_noob: J'utilise la version mongo-3.0.1 pilote java –

Répondre

0

Je pense que vous supposez incorrectement que puisque vous avez mis field1.put("Demo", 1);, il vous renverrait le document intérieur, alors qu'importe ce qu'il retournerait toujours votre document complet ce qu'il fera est omettre d'autres champs, mais même alors il serait document complet qui est directement à la racine.

while (cursor.hasNext()) { 
    object = (BasicDBObject) cursor.next(); 
    Map map = object.toMap(); 
    Mode.put("Mode", map.get("Demo").get("Demo Data").get("Mode")); //pre-check for NPE 
    System.out.println("Mode value is"+Mode); 
} 
+0

Ok merci, mais je me demande s'il y a moyen de chercher dans le sous-document particulier dans un seul appel/méthode sans imbriquer les méthodes get? –

+0

mongo driver retournera toujours le document complet, si vous voulez l'obtenir sans le changer en carte, je pense que vous devrez essayer un hit et trial peut-être object.get ("Demo.Demo Data.Mode"), mais je doutez-en puisque cela est spécifique à la mise en œuvre du pilote. –