2017-04-14 4 views
0

다음 json 구조가 있습니다. 나는 hData._id가 null이 아닌 java에서 다음 몽고 쿼리를 실행하려고한다. 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로 작성된 코드

그러나 hData._id가 null로 반환

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(); 
     } 

이다. 이걸 좀 도와 주실 래요?

+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가로 표시됩니다주의.

편집 당신이 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. 신원이 모두 이드입니까? 그렇다면'ObjectId id = hData.getObjectId ("_ id")'를 사용하거나 먼저 데이터를 수정하십시오. – Veeram