2017-04-14 13 views
0

私は次のJSON構造を持っています。私は、hData._idがnullでないjavaで次のmongoクエリーを実行しようとしています。MongoDB Java - ネストされたjsonでIDを取得する

MongoDb Query: db.Collection.find({},{"hData._id":1, "hData.createdBy":1}) 

{ 
    "_id" : ObjectId("55567e594e3256a23565ce58"), 
     "hData" : { 
     "isDeleted" : false, 
     "canDelete" : false, 
     "canUpdate" : false, 
     "createdBy" : “xyz”, 
     "createdDate" : "2015-05-15T15:05:30", 
     "_id" : "7" 
    }, 
    "changeDate" : "2015-02-19T16:02:12", 

} 

私はhData._idをフェッチするためにJavaで書かれているコードは

MongoCursor<Document> cur = col.find(new BasicDBObject("hData._id", new BasicDBObject("$ne",null)))).iterator(); 
     try{ 
      while(cur.hasNext()){ 
       System.out.println(cur.next().getObjectId("hData._id")); 
       i++; 
      } 
     }finally { 
      cur.close(); 
     } 

しかし、hData._idはnullとして返されています。これで私を助けてくれますか?

+0

cur.next()は何ですか?私はあなたのgetObjectId( "hData._id")を呼び出すことはできないと思う。 – vinay

+0

mongoのどのバージョンをお使いですか? – ProgrammerBoy

答えて

1

ドット表記を使用してネストされたプロパティを取得することはできません。 x.y

あなたの例では、hDataを最初に取得してから、_idで取得する必要があります。このように:

MongoCursor<Document> cur = col.find(new BasicDBObject("hData._id", new BasicDBObject("$ne",null))).iterator(); 

    while(cur.hasNext()){ 
     System.out.println(cur.next().get("hData", Document.class).getString("_id")); 
    } 

また、私はgetString()を使用しましたので、私の例ではあなたの例hData._idでその文字列としてではなくたObjectIdとして示されているが、注意してください。

EDIT それはあなたがhData._idのための混合型を有していても良いように聞こえる、ここで説明するために型チェックといくつかの余分なデバッグ出力を持つより堅牢な例ですので:

MongoCursor<Document> cur = col.find(new BasicDBObject("hData._id", new BasicDBObject("$ne",null))).iterator(); 

    while(cur.hasNext()){ 
     Document doc = cur.next(); 
     System.out.println("Document _id" + doc.get("_id")); 
     Document hdata = doc.get("hData", Document.class); 
     Object id = hdata.get("_id"); 
     System.out.println("hData._id " + id); 

     // check type if you need to 
     if (id instanceof String) { 
      System.out.println("hData._id is String: " + id); 
     } else if (id instanceof ObjectId) { 
      System.out.println("hData._id is ObjectId: " + id); 
     } else { 
      System.out.println("hData._id is of type " + id.getClass().getName()); 
     } 
    } 
+0

ありがとう@helmy、あなたは私の週末を保存しました。 – Saurabh

+0

こんにちは@helmy - 私はまだ特定の行を取得しています - ObjectIdはjava.lang.stringにキャストできません – Saurabh

+0

あなたのデータに混在型があるようです。あなたのデータの一貫性を維持したいかもしれません。とにかく、別のタイプの値をチェックして処理する方法の例を追加しました。 – helmy

1

あなたはFiltersProjectionsヘルパーメソッドを使用することができます。

try (MongoCursor<Document> cur = coll.find(Filters.ne("hData._id", null)).projection(Projections.include("hData._id", "hData.createdBy")).iterator()) { 
     while(cur.hasNext()){ 
       Document doc = cur.next(); 
       Document hData = doc.get("hData", Document.class); 
       String id = hData.getString("_id"); 
       String createdBy = hData.getString("createdBy"); 
     } 
    } 
+0

ありがとう@Veeram、私はどのように処理する-ObjectIdはjava.lang.stringにキャストできませんか? – Saurabh

+0

Np。 IDのすべてのオブジェクトIDですか?もしそうなら、 'ObjectId id = hData.getObjectId(" _ id ")'を使うか、そうでなければデータを最初に修正してください。 – Veeram

関連する問題