2019년 1월 18일 ObjectRocket.com/blog에 처음 게시되었습니다.
스키마의 유효성을 검사하거나 필드의 오타를 디버그하거나 설정하지 않아야 하는 필드를 찾으려면 MongoDB® 컬렉션의 모든 키를 이해해야 합니다.
ObjectRocket을 포함한 많은 MongoDB-as-a-Service 회사는 사용자 인터페이스(UI)에서 바로 이 작업을 수행할 수 있는 쉬운 방법을 제공합니다. 숙련된 MongoDB 사용자는 일반적으로 JavaScript®용 Mongoose 또는 Python®용 Mongoengine과 같은 객체 문서 매퍼(ODM)로 시작하므로 애플리케이션에 대한 일관된 스키마를 구축하고 오타를 줄일 수 있습니다. ODM은 또한 유형 유효성 검사를 수행하므로 정수가 있고 수학이 적용된 필드에 실수로 문자열을 입력하는 일이 없습니다.
서비스나 ODM이 없는 경우 다른 여러 방법을 사용하여 키에 액세스할 수 있습니다. 다양한 상황에서 MongoDB 컬렉션의 모든 키를 가져오는 다음 메서드를 찾았습니다.
MongoDB 키 찾기
다음 예가 있다고 가정합니다.
db.activities.insert( { type : [‘indoor’, 'outdoor' , ‘mixed’] } );
db.activities.insert( { activity : 'cycling' } );
db.activities.insert( { activity : ‘skiing’, location: ‘Alpes’, } );
db.activities.insert( { equipment : [‘paddles’,‘sunglasses’] } );
유형, 활동, 장비 및 위치와 같은 고유 키를 가져와야 합니다.
맵리듀스
다음 작업을 사용하여 MapReduce로 키를 가져올 수 있습니다.
mr = db.runCommand({ "mapreduce" : "activities", "map" : function() { for (var key in this) { emit(key, null); } }, "reduce" : function(key, stuff) { return null; }, "out": "activities" + "_keys" })
작업이 완료된 후 다음 distinct
를 실행합니다. 모든 키를 찾기 위한 결과 컬렉션에 대한 명령:
db.activities_keys.distinct("_id")
하위 문서의 모든 고유 키 목록을 얻으려면 다음 줄을 수정하십시오.
for (var key in this.first_level.second_level.nth_level) { emit(key, null); }
집계
집계를 사용할 수도 있습니다. 이 방법은 집계 프레임워크를 지원하는 모든 드라이버에서 작동합니다. 집계와 함께 $sample
사용 또는 $limit
오버헤드를 줄입니다.
참고: 기본 읽기 기본 설정으로 실행하면 성능에 영향을 미칠 수 있습니다. 보조 읽기 기본 설정으로 실행하는 것이 좋습니다.
$objectToArrray
와 함께 집계 사용 (버전 3.4.4 이상에서 사용 가능) 모든 상위 키 및 값 쌍을 $unwind
가 뒤따르는 문서 배열로 변환 및 $group
$addToSet
사용 전체 컬렉션에서 고유한 키를 가져옵니다.
다음 예에서 $$ROOT
최상위 문서를 참조합니다.
db.activities.aggregate([ {"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}}, {"$unwind":"$arrayofkeyvalue"}, {"$group":{"_id":null,"allkeys":{"$addToSet":"$arrayofkeyvalue.k"}}} ])
다음 명령을 사용하여 단일 문서에서 키를 가져오기 위해 집계를 사용할 수도 있습니다.
db.activities.aggregate([ {"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}}, {"$project":{"keys":"$arrayofkeyvalue.k"}} ])
몽고 쉘
다음 명령을 사용하여 Mongo 셸 클라이언트에서 키를 가져올 수도 있습니다.
var allKeys = {}; db.YOURCOLLECTION.find().forEach(function(doc){Object.keys(doc).forEach(function(key){allKeys[key]=1})}); allKeys;
단일 문서의 출력 필드
컬렉션의 각 문서에는 완전히 다른 키가 있을 수 있으므로 컬렉션의 단일 문서에 대한 필드 출력이 필요할 수 있습니다. 다음 명령을 사용하여 이 작업을 수행하십시오.
doc=db.thinks.findOne(); for (key in doc) print(key);
파이썬
Python을 사용하여 MongoDB 키를 얻을 수 있습니다. 다음 예는 컬렉션의 모든 최상위 키 집합을 반환합니다.
#Using pymongo and connection named 'db' reduce( lambda all_keys, rec_keys: all_keys | set(rec_keys), map(lambda d: d.keys(), db.things.find()), set() )
자바스크립트
JavaScript는 다음 예와 같이 키를 가져오는 또 다른 방법을 제공합니다.
db.collection('collectionName').mapReduce( function() { for (var key in this) { emit(key, null); } }, function(key, stuff) { return null; }, { "out": "allFieldNames" }, function(err, results) { var fields = db.collection('allFieldNames').distinct('_id'); fields .then(function(data) { var finalData = { "status": "success", "fields": data }; res.send(finalData); delteCollection(db, 'allFieldNames'); }) .catch(function(err) { res.send(err); delteCollection(db, 'allFieldNames'); }); });
새로 생성된 allFieldNames
컬렉션을 읽은 후 , 삭제하십시오.
db.collection("allFieldNames").remove({}, function (err,result) { db.close(); return; });
많은 옵션
이 Mongo 키를 얻을 수 있는 많은 옵션이 있습니다. MongoDB 관리에 압도되어 데이터베이스 관리 대신 코드에 집중하고 싶다면 여기에서 도와드리겠습니다.
Rackspace DBA 서비스에 대해 자세히 알아보십시오.
피드백 탭을 사용하여 의견을 작성하거나 질문하십시오. 저희와 대화를 시작할 수도 있습니다.