복붙노트

[MONGODB] 임의의 깊이에서 MongoDB를 필드 이름을 찾는 방법

MONGODB

임의의 깊이에서 MongoDB를 필드 이름을 찾는 방법

나는 몽고 데이터베이스에 일부 실수 XML 데이터 정렬의 수입. 각 문헌은 약 50-10의 깊이에 내포 된 서브 문서를 갖는다. 나는 () 필드가 하위 문서에서 어떤 깊이에 나타날 수 있습니다 (여러 번 나타날 수 있습니다) 특정 필드의 특정 값이 문서를 찾을 싶습니다.

저는 현재 파이썬으로 각 문서를 당기고 그 사전을 검색하지만 데이터베이스는 그 내용의 필드 이름 어딘가의 특정 값을 갖는 문서를 반환하는 필터의 프로토 타입을 명시 할 수 있다면 좋은 일 것입니다.

여기에 예제 문서입니다 :

{
    "foo": 1,
    "bar": 2,
    "find-this": "Yes!",
    "stuff": {
        "baz": 3,
        "gobble": [
            "wibble",
            "wobble",
            {
                "all-fall-down": 4,
                "find-this": "please find me"
            }                
        ],
        "plugh": {
            "plove": {
                "find-this": "Here too!"
            }
        }
   }
}

그래서, 나는 "발견-이"필드가 문서를 찾으려면, 그리고 (가능한 경우) "찾을-이"필드의 특정 값이 문서를 찾을 수 있도록.

해결법

  1. ==============================

    1.XML 문서는 당신은 BSON 문서의 특정 문에 맞다 아니다. XML은 트리 구조로로드 년부터 인해 임의 키를 검색 "노드"의 포함은 아주 쉽다는 것을.

    XML 문서는 당신은 BSON 문서의 특정 문에 맞다 아니다. XML은 트리 구조로로드 년부터 인해 임의 키를 검색 "노드"의 포함은 아주 쉽다는 것을.

    MonoDB 문서는 프로세스 그렇게 간단하지이며, 일반적으로 모두 "인덱스"를 쉽게 그것을하고 검색하기 위해 데이터 위치의 특정 "균일 성"을 가질 것으로 예상된다, 그래서 이것은 여러면에서 "데이터베이스"입니다.

    그럼에도 불구하고, 수행 할 수 있습니다. 그러나 물론 이것은 재귀 프로세스가 서버에서 실행이 수단이 자바 스크립트 어디 $로 처리를 의미한다.

    기본 쉘 예를 들어,하지만 일반적인 기능은 어디 다른 곳 연산자 $ 단지 문자열 인수는 다음과 같습니다

    db.collection.find(
      function () {
        var findKey = "find-this",
            findVal = "please find me";
    
        function inspectObj(doc) {
          return Object.keys(doc).some(function(key) {
            if ( typeof(doc[key]) == "object" ) {
              return inspectObj(doc[key]);
            } else {
              return ( key == findKey && doc[key] == findVal );
            }
          });
        }
        return inspectObj(this);
      }
    )
    

    그들이 원하는 "필드 이름"및 내용과 일치한다면 기본적으로 키가 객체에 존재하는 테스트를 확인합니다. 그 열쇠 중 하나가 "개체"인 것을 일어나는 경우 함수에 재귀 적으로 다시 검사합니다.

    자바 스크립트 K2661에 ()는 "첫 번째"일치하는 검색 기능은 진정한 결과를 제공하고 "키 / 값이"어떤 깊이에 존재 어디 객체를 반환에서 반환 발견 있는지 확인합니다.

    참고 기본적으로 컬렉션에 "인덱스"에 적용 할 수있는 것보다 다른 유효한 쿼리 필터가없는 한 전체 집합을 통과하는 의미 $ 것을.

    주의 사용 여부를 전혀하고보다 가능한 형태로 데이터를 재 - structring 그냥 작업 그래서.

    그러나 이것은 당신에게 당신의 일치를 제공 할 것입니다.

  2. ==============================

    2.저는 여기에 문서 구조에서 키 - 값 어디서나에 대한 재귀 검색에 사용하는 하나의 예입니다 :

    저는 여기에 문서 구조에서 키 - 값 어디서나에 대한 재귀 검색에 사용하는 하나의 예입니다 :

    db.getCollection('myCollection').find({
    
        "$where" : function(){
    
            var searchKey = 'find-this';
            var searchValue = 'please find me';
    
            return searchInObj(obj);
    
            function searchInObj(obj){                            
              for(var k in obj){       
                if(typeof obj[k] == 'object' && obj[k] !== null){
                  if(searchInObj(obj[k])){
                    return true;
                  }
                } else {
                  if(k == searchKey && obj[k] == searchValue){
                    return true;
                  }
                }          
              }                         
              return false;
            }       
        }    
    })
    
  3. from https://stackoverflow.com/questions/31197652/how-to-find-mongodb-field-name-at-arbitrary-depth by cc-by-sa and MIT license