복붙노트

[MONGODB] 필드 MongoDB의 존재 질의 향상

MONGODB

필드 MongoDB의 존재 질의 향상

나는 우리의 고객을위한 MongoDB를 추정과 진행에있어. 요구 사항에 따라 우리는 이름 - 값 쌍 중 일부 개체 엔트 변수 세트와 연결할 필요가 없다.

db.ent.insert({'a':5775, 'b':'b1'})
db.ent.insert({'c':'its a c', 'b':'b2'})
db.ent.insert({'a':7557, 'c':'its a c'})

이후 나는 집중적으로 필드의 존재에 대한 쿼리 엔트가 필요합니다 :

db.ent.find({'a':{$exists:true}})
db.ent.find({'c':{$exists:false}})

당 MongoDB를 워드 프로세서 :

와 빠른 처리하는 (심지어 변화 패러다임으로) 더 효율적인 방법을 제공하는이 전문가는 이름 - 값 쌍을 변화 할 수있다

해결법

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

    1.이 같은 스키마를 재 설계 할 수 있습니다 :

    이 같은 스키마를 재 설계 할 수 있습니다 :

    {
      pairs:[
      {k: "a", v: 5775},
      {k: "b", v: "b1"},
      ]
    }
    

    그런 다음 당신은 당신의 키를 색인 :

    db.people.ensureIndex({"pairs.k" : 1})
    

    이 후에는 정확한 일치로 검색 할 것입니다 :

    db.ent.find({'pairs.k':"a"})
    

    경우 당신이 스파 스 지수와 @WesFreeman에 의해 제안 된 현재 스키마로 이동, 당신은 당신이 검색 할 각 키에 인덱스를 생성해야합니다. 그것은 쓰기 성능에 영향을 미칠 수 있습니다 또는 키가 정적이 아닌 경우 허용되지 않습니다.

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

    2.단순히이 색인 쿼리하도록 스키마를 재 설계. 사용 사례는 MongoDB의 확실한 가이드에 주어진 첫 번째 예제 응용 프로그램 가리키고 유사하다.

    단순히이 색인 쿼리하도록 스키마를 재 설계. 사용 사례는 MongoDB의 확실한 가이드에 주어진 첫 번째 예제 응용 프로그램 가리키고 유사하다.

    당신이 원하는 경우 / result.a의 편의를 그냥 어딘가에 색인 키를 저장해야합니다.

    대신 기존의 :

    db.ent.insert({a:5775, b:'b1'})
    

    하다

    db.ent.insert({a:5775, b:'b1', index: ['a', 'b']})
    

    그 다음 색인 쿼리 :

    db.end.find({index: "a"}).explain()
    {
        "cursor" : "BtreeCursor index_1",
        "nscanned" : 1,
        "nscannedObjects" : 1,
        "n" : 1,
        "millis" : 0,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "isMultiKey" : true,
        "indexOnly" : false,
        "indexBounds" : {
            "index" : [
                [
                    "a",
                    "a"
                ]
            ]
        }
    }
    

    당신이 이제까지 인 경우 또는 예상 값으로도 조회 할 수 있습니다 :

    db.ent.insert({
        a:5775, 
        b:'b1', 
        index: [
            {name: 'a', value: 5775}, 
            {name: 'b', value: 'b1'}
        ]
    })
    

    그것은 또한 색인 쿼리 :

    db.end.find({"index.name": "a"}).explain()
    {
        "cursor" : "BtreeCursor index.name_",
        "nscanned" : 1,
        "nscannedObjects" : 1,
        "n" : 1,
        "millis" : 0,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "isMultiKey" : true,
        "indexOnly" : false,
        "indexBounds" : {
            "index.name" : [
                [
                    "a",
                    "a"
                ]
            ]
        }
    }
    
  3. ==============================

    3.난 당신이 각 필드에 대한 인덱스를해야하지만, 스파 스 인덱스가,이에 대한 답이라고 생각합니다. http://www.mongodb.org/display/DOCS/Indexes#Indexes-SparseIndexes

    난 당신이 각 필드에 대한 인덱스를해야하지만, 스파 스 인덱스가,이에 대한 답이라고 생각합니다. http://www.mongodb.org/display/DOCS/Indexes#Indexes-SparseIndexes

    $ 존재와 스파 스 인덱스는 도움이 될 것입니다 진정한 쿼리를.

    당신의 분야가 (이 주로 설정되어 의미) 정말 희소하지 않은 경우에도 여전히, 많은 당신을 도움이 될 것 아니에요.

    업데이트 내가 틀렸다 같아요. 외모 (https://jira.mongodb.org/browse/SERVER-4187) 여전히 $ 스파 스 인덱스를 사용하지 않는 존재 개방 문제가있는 것처럼. 그러나, 당신은 제대로 스파 스 인덱스를 사용과 같은 종류의 발견과 함께 같은 것을 할 수 있습니다 :

    db.ent.find({}).sort({a:1});
    

    다음은 차이의 전체 데모는 예를 들어 값을 사용하여,이다 :

    > db.ent.insert({'a':5775, 'b':'b1'})
    > db.ent.insert({'c':'its a c', 'b':'b2'})
    > db.ent.insert({'a':7557, 'c':'its a c'})
    > db.ent.ensureIndex({a:1},{sparse:true});
    

    그 발견을 ({}) 참고 종류 ({A : 1}). 인덱스 (BtreeCursor)를 사용합니다 :

    > db.ent.find({}).sort({a:1}).explain();
    {
    "cursor" : "BtreeCursor a_1",
    "nscanned" : 2,
    "nscannedObjects" : 2,
    "n" : 2,
    "millis" : 0,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
        "a" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ]
    }
    }
    

    전체 검사 수행 ({} 사실 : {$가 존재하는이}) 그리고 찾을 수 있습니다 :

    > db.ent.find({a:{$exists:true}}).explain();
    {
    "cursor" : "BasicCursor",
    "nscanned" : 3,
    "nscannedObjects" : 3,
    "n" : 2,
    "millis" : 0,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
    
    }
    }
    

    인덱스를 사용하도록 강제로 : 당신 같은 외모도 ({1}이) .hint 사용할 수 있습니다.

    > db.ent.find().hint({a:1}).explain();
    {
    "cursor" : "BtreeCursor a_1",
    "nscanned" : 2,
    "nscannedObjects" : 2,
    "n" : 2,
    "millis" : 0,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
        "a" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ]
    }
    }
    
  4. ==============================

    4.어떻게 설정에 대한 null로 필드를 비 - 존재? 그럼 당신은 {{$ NE : 널 (null)} 필드}로 쿼리 할 수 ​​있습니다.

    어떻게 설정에 대한 null로 필드를 비 - 존재? 그럼 당신은 {{$ NE : 널 (null)} 필드}로 쿼리 할 수 ​​있습니다.

    db.ent.insert({'a':5775, 'b':'b1', 'c': null})
    db.ent.insert({'a': null, 'b':'b2', 'c':'its a c'})
    db.ent.insert({'a':7557, 'b': null, 'c':'its a c'})
    
    db.ent.ensureIndex({"a" : 1})
    db.ent.ensureIndex({"b" : 1})
    db.ent.ensureIndex({"c" : 1})
    
    db.ent.find({'a':{$ne: null}}).explain()
    

    다음은 출력입니다 :

    {
        "cursor" : "BtreeCursor a_1 multi",
        "isMultiKey" : false,
        "n" : 4,
        "nscannedObjects" : 4,
        "nscanned" : 5,
        "nscannedObjectsAllPlans" : 4,
        "nscannedAllPlans" : 5,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 0,
        "indexBounds" : {
            "a" : [
                [
                    {
                        "$minElement" : 1
                    },
                    null
                ],
                [
                    null,
                    {
                        "$maxElement" : 1
                    }
                ]
            ]
        },
        "server" : "my-laptop"
    }
    
  5. from https://stackoverflow.com/questions/9009987/improve-querying-fields-exist-in-mongodb by cc-by-sa and MIT license