2017-04-13 6 views
0

db.collection.explain().find()을 실행하면 다음 오류가 발생합니다. 나는이 객체를 구문 분석 할 때 MongoDB가 적절한 JSON을 반환하지 않습니다

The last field in this json object has a double quote problem: `"totalChildMillis" : NumberLong(2)`. 

, 나는 NumberLong(2) 이중 인용해야한다는 예외를 얻었다. MongoDB가 표준 JSON 객체를 반환하는 방법이 있습니까?
{ 
    "executionStages":{ 
     "stage": "SINGLE_SHARD", 
     "nReturned": 10000, 
     "executionTimeMillis": 3, 
     "totalKeysExamined": 0, 
     "totalDocsExamined": 10000, 
     "totalChildMillis": NumberLong(2) 
    } 
} 

EDIT1

나는 현재 몽고 쉘의 하위 프로세스를 생성하는 자바 스크립트 NodeJS를 사용하고 있습니다. 그리고 그 과정에 explain 명령을 보내고 그 결과를 들어라. 일단 출력물을 얻었 으면 JSON.parse() 메서드로 javascript 객체로 파싱해야합니다. 이 유스 케이스를 기반으로 mongo json 확장을 표준 자바 스크립트 객체로 적용하는 더 쉬운 방법은 무엇입니까?

답변

0

MongoDB Extended JSON의 문서를 참조하십시오. 기본적으로 MongoDB가 JSON을 확장하여 JSON이 지원하지 않는 추가 데이터 유형을 추가한다는 사실이 나옵니다. 해당 유형 정보를 유지하기 위해 다양한 도구는 데이터 유형을 나타 내기 위해 NumberLong() 및 ISODate()와 같은 표기법을 사용하며 일반적으로 구문 분석 할 수없는 "mongo shell"모드 또는 "JSON RFC에 확인하는"엄격 모드를 사용합니다 JSON 파서를 사용하여.

어떤 일을하는지에 따라 엄격한 모드로 출력하는 옵션이있는 mongoexport을 사용할 수 있습니다. 그러나 만약 당신이 쿼리의 Explain 계획을 평가하려고한다면, 당신이 temp 컬렉션에 Explain 계획을 삽입 한 다음 그것을 mongoexport하지 않으면 작동하지 않을 것이라고 생각합니다.

가장 좋은 방법은 프로그래밍 언어 (예 : Java, Perl, Python, C# 등)와 해당 MongoDB 드라이버 중 하나를 사용하여 수행하려는 스크립팅을하는 것입니다. 여기서 데이터를 검색하고 구문 분석하는 방법으로 훨씬 더 많은 유연성과 성능을 얻을 수 있습니다.

편집에서 Node.js를 사용 중이라고 언급 했으므로 explain 옵션을 사용하면 하위 프로세스를 생성하지 않고도 노드에서 직접 Explain 출력을 얻을 수 있습니다. 당신의 응답을

var url = 'mongodb://localhost:27017/test'; 
var MongoClient = require('mongodb').MongoClient; 
MongoClient.connect(url, function(err, db) { 
    assert.equal(null, err); 
    var collection = db.collection('test'); 
    collection.find({}, {explain:true}).each(function(err, doc) { 
    if(doc != null) 
     console.dir(doc); 
    }); 
}); 
+0

감사 :

여기에 아주 기본적인 예입니다. 질문에 유스 케이스를 추가했습니다. 당신은 나를보고 당신의 제안을 알려줄 수 있었습니까? –

+0

예 Node.js를 사용하고 있지만 드라이버를 사용하지 않았습니다. nodejs에 mongo-shell의 하위 프로세스를 생성하고 표준 출력 스트림을 수신합니다. 그래서 mongo-shell이 ​​표준 json 출력을 리턴하는 방법이 있습니까? –

+0

불가능하지 않습니다. 그리고 제가 말했듯이, 운전자 접근법이 최선의 접근법입니다. – helmy

관련 문제