복붙노트

[MONGODB] 명시 적으로 이름을 지정하지 않고 MongoDB의에서 모든 필드의 값을 검색

MONGODB

명시 적으로 이름을 지정하지 않고 MongoDB의에서 모든 필드의 값을 검색

나는 MongoDB의 문서를 보면서이 질문을 봤지만 정말 적절한 해답을 찾을 수 없습니다. 그래서, 여기에 내가 무엇을 찾고있다. 나는이 같은 요소의 컬렉션이 가정 :

{
   "foo" : "bar",
   "test" : "test",
   "key" : "value",
}

내가 달성하고자하는 필드 (아마도 ;-) 유한 한 많은 제외) 모두 검색하여 요소를 찾을 수 있습니다. 즉 : 쿼리 감안할 때, 나는 쿼리가 발견되어야하는 분야에서 모른다.

이런 내 생각 뭔가

db.things.find({_ANY_ : "bar"}) 

나에게 예제 요소를 줄 것이다.

도와 주셔서 감사 해요.

해결법

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

    1.모든 필드에서 텍스트 검색을 수행하려면 먼저 모든 필드에 텍스트 인덱스를 작성해야합니다.

    모든 필드에서 텍스트 검색을 수행하려면 먼저 모든 필드에 텍스트 인덱스를 작성해야합니다.

    MongoDB를 문서 알 수 있듯이, "문자열의 내용을 포함하는 모든 필드 인덱스에 와일드 카드 지정자 ($ **)를 사용, 문자열 내용으로 모든 필드에 텍스트 검색을 허용합니다."

    당신이 몽고 쉘 내부에서 작업하는 경우 다음 '컬렉션'사용하려는 DB에서 컬렉션의 이름이 명령으로 작업을 수행 할 수 있습니다, (당신은 '몽고'호출하여 명령 줄에서 실행된다).

    db.collection.createIndex ({ "$ **": "텍스트"}, {이름 : "TextIndex"})

    두 번째 목적은, 즉 {이름 : "TextIndex은"}, 선택 사항입니다 ... 한 번에 모음 당 하나의 텍스트 인덱스 (이있을 수 있기 때문에 실제로 인덱스에 이름을 부여 할 필요가 없습니다 ... 당신을 ) 인덱스를 삭제하고 원하는 경우 새로 만들 수 있습니다.

    모든 필드에 텍스트 인덱스를 만든 후에는 다음 쿼리 개체 간단한 텍스트 검색을 수행 할 수 있습니다 {$ 텍스트 : {$ 검색 : <당신의 문자열>}}

    당신은 자바 스크립트 기능을 작성하는 경우 그래서, 당신이 뭔가를 같이 할 수 있습니다 :

    var에 커서 = db.collection () 발견 ({$ 텍스트 : {$ 검색 : <당신의 문자열>}}).;

    검색을 제어 할 수있는 다양한 방법에 대한 자세한 정보를 원하시면, 여기에 텍스트 검색에 MongoDB의 설명서를 참조하십시오

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

    2.비슷한 질문이 대답은 내가 완성도 여기를 반복합니다 솔루션을 가지고 있습니다. 이 쿼리의 거의 모든 다른 종류보다 훨씬 느릴 것이라는 경고와 함께, 운영자가 MongoDB를 서버 (들)에 임의의 자바 스크립트를 실행하는 곳 $를 사용할 수 있습니다. 귀하의 예를 들어, 다음과 같습니다

    비슷한 질문이 대답은 내가 완성도 여기를 반복합니다 솔루션을 가지고 있습니다. 이 쿼리의 거의 모든 다른 종류보다 훨씬 느릴 것이라는 경고와 함께, 운영자가 MongoDB를 서버 (들)에 임의의 자바 스크립트를 실행하는 곳 $를 사용할 수 있습니다. 귀하의 예를 들어, 다음과 같습니다

    db.things.find({$where: function() {
        for (var key in this) {
            if (this[key] === "bar") {
                return true;
            }
        }
        return false;
    }});
    
  3. ==============================

    3.이 개별적으로 검사 문서 응용 프로그램 측없이 또는 서버 측 코드의 실행을 통해 수 없습니다. 에 스키마를 변경하는 것이 좋습니다 :

    이 개별적으로 검사 문서 응용 프로그램 측없이 또는 서버 측 코드의 실행을 통해 수 없습니다. 에 스키마를 변경하는 것이 좋습니다 :

    {params:[{field:"foo", value:"bar"}, {field:"test", value:"test"}, {field:"key", value:"value"}]}
    

    이것은 분명히 (주로 성능과 poluted 스키마) 몇 가지 단점을 가지고 있지만 통해 필요한 수 있습니다 :

    db.things.find({'params.value':"bar"})
    
  4. ==============================

    4.슬프게도, 이전 답변을 아무도 몽고는 배열이나 중첩 된 객체에 중첩 된 값을 포함 할 수 있다는 사실을 해결합니다.

    슬프게도, 이전 답변을 아무도 몽고는 배열이나 중첩 된 객체에 중첩 된 값을 포함 할 수 있다는 사실을 해결합니다.

    이는 올바른 QUERY입니다

    {$where: function() {
        var deepIterate = function  (obj, value) {
            for (var field in obj) {
                if (obj[field] == value){
                    return true;
                }
                var found = false;
                if ( typeof obj[field] === 'object') {
                    found = deepIterate(obj[field], value)
                    if (found) { return true; }
                }
            }
            return false;
        };
        return deepIterate(this, "573c79aef4ef4b9a9523028f")
    }}
    

    질의는 모든 중첩 요소에 반복되며, 값과 키가 발견 될 때까지 모든 것을 반복하는 수단이 '물체'를 반환 배열 또는 중첩 된 객체에 대해서 typeof 전화입니다.

    당신은 중첩 된 값으로 이전 답변을 확인하실 수 있습니다 원하는에서 결과까지 될 것입니다.

    전체 개체를 Stringifying 것은 그들을 일치하려고 한 모든 메모리 섹터의 하나를 통해이 반복이 있기 때문에 훨씬 적은 확대됨입니다. 그리고 램 메모리에 문자열로 객체의 복사본 (더 많은 RAM과 기능 컨텍스트가 이미로드 된 객체를 가지고 있기 때문에 느린 쿼리 사용하기 때문에 모두 비효율적)을 만듭니다

  5. ==============================

    5.당신은 재귀 함수와 함께 할 수 있습니다 :

    당신은 재귀 함수와 함께 할 수 있습니다 :

    var recursiveSearch = function(query) {
        db.test_insert.find().forEach(function(items) {
            var i = 0;
            var recursiveFunc = function(itemsArray, itemKey) {
                var itemValue = itemsArray[itemKey];
                if(itemValue === query) { 
                    printjson(items);
                }       
    
                if(typeof itemValue === "object") {
                    Object.keys(itemValue).forEach(function(itemValueKey) {
                        recursiveFunc(itemValue, itemValueKey);
                    });
                }
            };
            Object.keys(items).forEach(function(item){
                recursiveFunc(items, item);
            });
        });
    };
    
    recursiveSearch('your string');
    
  6. ==============================

    6.전체 테이블 스캔을 수행과 동일하며 인덱스를 사용할 수 없습니다 $를 사용. 나는 또한 그러나 나는이 일을 찾았어요, 작업 가져올 수 없습니다 (그것도 전체 테이블 스캔에 해당 않습니다)

    전체 테이블 스캔을 수행과 동일하며 인덱스를 사용할 수 없습니다 $를 사용. 나는 또한 그러나 나는이 일을 찾았어요, 작업 가져올 수 없습니다 (그것도 전체 테이블 스캔에 해당 않습니다)

    db.collection.find().forEach(function(doc){
    for (var key in doc) {
        if ( /needle/.test(doc[key]) )
            printjson(doc);
        }
    });
    

    여기서 / 니들 / 문서의 값을 찾을 수있는 정규 표현식은 [키]

  7. ==============================

    7.텍스트 검색을 수행하려면, 당신은 당신의 컬렉션에 대한 텍스트 인덱스를 생성해야합니다. 인덱스 텍스트 : 자세한 내용은, 몽고 문서에서보기를 위해

    텍스트 검색을 수행하려면, 당신은 당신의 컬렉션에 대한 텍스트 인덱스를 생성해야합니다. 인덱스 텍스트 : 자세한 내용은, 몽고 문서에서보기를 위해

  8. ==============================

    8.

    {
       "foo" : "bar",
       "test" : "test",
       "key" : "value",
    }
    
    db.collection_name.find({'foo':"bar"})
    
  9. from https://stackoverflow.com/questions/6790819/searching-for-value-of-any-field-in-mongodb-without-explicitly-naming-it by cc-by-sa and MIT license