$ fields를 포함하는 객체로 변환 된 일부 필드 대신 MongoDB에서 문서를 가져 오는 방법이 있습니까?
예를 들어, 나는 긴 값을 저장하는 timestamp라는 필드를 가지고 있습니다.
{
"$numberLong": "1474402633708"
}
이 중첩 된 개체에 대한 _id 필드와 동일합니다 : 그것은 단지 값과는 약 일주일 후에 객체를 반환 시작되는 모든 갑자기을 반환하는 데 사용. 그것은 "_id"를 반환하고 어떤 시점에서 최상위 레벨과 같이 $ oid를 가진 객체를 반환하도록 전환했습니다. 적어도 일관성이 있어야합니다.
다음은 MongoDB Client의 스크린 샷입니다. JSON에 연재 될 때 첫 번째 것은 $ numberLong을 반환하지 않지만 마지막 것은 수행하지 않습니다.
어딘가에이 단지 구성을인가? 그것은 절대 의미가 없습니다.
여기 콘솔에서 타임 스탬프 필드의 데이터가 다른지 의심 스럽습니다.
> 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이 반환됩니다. 이제는 긴 가치가 어떻게 언젠가 두 배로 그리고 때로는 오랫동안 저장 될지에 대한 질문이 내려집니다.
드라이버를 사용하거나 Mongo 셸에서 응용 프로그램 내부에서 발생합니까? –
MongoDB Java 클라이언트를 사용할 때 이런 현상이 발생합니다. – juminoz
특히, toJson 메서드 호출의 반환 값에서이 값이 표시됩니다. – juminoz