2016-09-20 8 views
0

$ fields를 포함하는 객체로 변환 된 일부 필드 대신 MongoDB에서 문서를 가져 오는 방법이 있습니까?

예를 들어, 나는 긴 값을 저장하는 timestamp라는 필드를 가지고 있습니다.

{ 
    "$numberLong": "1474402633708" 
} 

이 중첩 된 개체에 대한 _id 필드와 동일합니다 : 그것은 단지 값과는 약 일주일 후에 객체를 반환 시작되는 모든 갑자기을 반환하는 데 사용. 그것은 "_id"를 반환하고 어떤 시점에서 최상위 레벨과 같이 $ oid를 가진 객체를 반환하도록 전환했습니다. 적어도 일관성이 있어야합니다.

다음은 MongoDB Client의 스크린 샷입니다. JSON에 연재 될 때 첫 번째 것은 $ numberLong을 반환하지 않지만 마지막 것은 수행하지 않습니다.

enter image description here

어딘가에이 단지 구성을인가? 그것은 절대 의미가 없습니다.

여기 콘솔에서 타임 스탬프 필드의 데이터가 다른지 의심 스럽습니다.

> db["page"].find() 
{ "_id" : ObjectId("57dd99ab390a777a9720e8c2"), "entries" : [ { "widget" : { "_id" : ObjectId("57dec085390a777a9720e8c5"), "_db" : "system-s", "_col" : "card" }, "width" : -1, "height" : -1 }, { "widget" : { "_id" : ObjectId("57df6119390a778641f4fd25"), "_db" : "system-s", "_col" : "card" }, "width" : -1, "height" : -1 } ], "title" : "Simple 2", "timestamp" : 1474257177398 } 
{ "_id" : ObjectId("57e171ff303c2807d6ea1dd6"), "entries" : [ { "widget" : { "_id" : ObjectId("57e1720b303c2807d6ea1dd9"), "_db" : "system-s", "_col" : "card" }, "width" : -1, "height" : -1 } ], "title" : "Test 2", "timestamp" : 1474392587984 } 

현재 MongoDB Java lib v3.3.0으로 테스트 중입니다. 도움이 될 수 있도록 코드가 있습니다.

//the endpoint is exposed using Spark 
get("/db/:collection/get/:id", (request, response) -> { 
    String collectionName = request.params(":collection"); 
    String id = request.params(":id"); 

    Document doc = getDocument(collectionName, id); 
    return doc.toJson(); //this is where I see the issues 
}); 

public Document getDocument(String collectionName, String id){ 
    MongoCollection<Document> coll = db.getCollection(collectionName); 

    BasicDBObject query = new BasicDBObject(); 
    query.put("_id", new ObjectId(id)); 
    FindIterable<Document> itr = coll.find(query); 
    Document doc = itr.first(); 
    if(doc != null){ 
     return doc; 
    } 

    return null; 
} 

여기에 있는지 데이터가 여러분이이 문제에 대해 실행할 경우 일치하기 위해 자바 스크립트의 해결 방법입니다. 이 코드는 몇 가지 jQuery 함수를 사용하지만 jQuery를 사용하지 않으면이를 대체 할 수 있습니다.

function scrub(obj){ 
    if(obj.$oid){ 
     return obj.$oid; 
    }else if(obj.$numberLong){ 
     return parseInt(obj.$numberLong); 
    }else if(obj.$numberInt){ 
     return parseInt(obj.$numberInt); 
    }else if(obj.$date){ 
     if($.isPlainObject(obj.$date) && obj.$date.$numberLong){ 
      return parseInt(obj.$date.$numberLong); 
     }else{ 
      return parseInt(obj.$date); 
     } 
    }else{ 
     $.each(obj, function(k, v){ 
      if($.isPlainObject(v)){ 
       obj[k] = scrub(v); 
      }else if($.isArray(v)){ 
       $.each(v, function(kk, vv){ 
        if($.isPlainObject(vv)){ 
         v[kk] = scrub(vv); 
        } 
       }); 
      } 
     }); 
    } 

    return obj; 
}; 

업데이트 1 :

라인 별 디버깅 후, 나는 다시 긴 값이 어떻게 든 더블 (지수 값)으로 해석하는 경우에, 그 다음 내가 갖는 것을 발견 기대 값은 long으로 해석되는 반면 (int64), 기본 모드는 STRICT이므로 $ numberLong이 반환됩니다. 이제는 긴 가치가 어떻게 언젠가 두 배로 그리고 때로는 오랫동안 저장 될지에 대한 질문이 내려집니다.

+0

드라이버를 사용하거나 Mongo 셸에서 응용 프로그램 내부에서 발생합니까? –

+0

MongoDB Java 클라이언트를 사용할 때 이런 현상이 발생합니다. – juminoz

+0

특히, toJson 메서드 호출의 반환 값에서이 값이 표시됩니다. – juminoz

답변

0

문제점을 발견했습니다. Mongo Client (http://www.mongoclient.com)는 long 값을 double로 저장합니다. 내 코드가 갑자기 중단되는 이유는 도구를 사용하여 손상된 데이터를 제거하려고 시도했기 때문에 long 값이 double 값으로 저장 되었기 때문입니다. 이로 인해 일치하지 않게되었습니다. 하나의 문서를 수정하면 실제로 결과 집합의 모든 문서가 다시 저장된다는 사실을 알지 못했기 때문에 처음에는이 사실을 알지 못했습니다.

그리고 주제의 질문에 답하십시오. $ 필드는 제외 할 수 없습니다.직렬화는 다음과 같이 작동합니다

32 int -> always value 
64 int -> STRICT uses $numberLong, CONSOLE uses NumberLong(d), UNKNOWN uses value 
double -> always value 

를 null하고 알 수없는 모드에 대한 예외를 던질 것이다 오브젝트 ID의 직렬화 이후 작업을 얻을 수있는 모드를 설정하는 방법은 없습니다.

0

mongoDB에 액세스하기 위해 어떤 클라이언트를 사용하고 있습니까?

클라이언트가 잘못된 형식으로 데이터를 표시하고있는 것 같습니다. GUI 클라이언트를 원하면 mongo shell 또는 robomongo로 이것을 확인할 수 있습니다.

+0

적어도 타임 스탬프 필드에 대해 데이터가 잘못 표시되지 않습니다. 위의 mongo 쉘 출력을 볼 수 있습니다. 그들은 정확히 동일합니다. 당신이 mongo shell이 ​​틀렸다는 것을 말하지 않는다면 이것은 있습니다. – juminoz

+0

셸이 잘못되었습니다. 하지만 개인적으로 경험 한 mongo shell과 java 드라이버 사이에는 약간의 차이가 있습니다. –

+0

질문에 대한 업데이트를 추가했습니다. $ numberLong없이 long으로 serialize 된 것은 어떻게 든 double로 저장됩니다. – juminoz

관련 문제