복붙노트

[MONGODB] $ 연산자 존재와 필드의 존재 여부를 검사 할 때 캔 MongoDB를 인덱스를 사용합니까?

MONGODB

$ 연산자 존재와 필드의 존재 여부를 검사 할 때 캔 MongoDB를 인덱스를 사용합니까?

내 사용자 컬렉션에서 데이터가있는 경우 외모가 좋아하는 :

{ name: '...', 
  email: '...', 
  ...,
  photos: {
     123: { url: '...', title: '...', ... },
     456: { url: '...', title: '...', ... },
     ...
  }
} 

그리고 난 다음 내가 쿼리를 사용하고, 사용자가 사진이 부착 된 신분증 127 소유 찾으려면 :

db.users.find( {'photos.127': {'$exists' => true} } );

나는 시도했다, 그러나 MongoDB를이 쿼리에 대한 인덱스를 사용하여 얻을 수하지 않는 것 같습니다. 내가 시도 인덱스했다 : db.users.ensureIndex ({사진 1}); 나는 () 설명 사용할 때 그리고 몽고는 (즉, 인덱스가 사용되지 않았다)를 BasicCursor를 사용하던 나에게 말했다.

그것은 몽고이 쿼리에 사용할 것을 인덱스를 생성 할 수 있습니까?

해결법

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

    1.아니, 쿼리를 존재에 대한 사용 지수에 MongoDB를 말할 수있는 방법이 없습니다. 인덱싱은 완전히 데이터 관련이있다. $ 만이 인덱스에서 사용하지 못할 키 (필드)에 관련되어 존재입니다.

    아니, 쿼리를 존재에 대한 사용 지수에 MongoDB를 말할 수있는 방법이 없습니다. 인덱싱은 완전히 데이터 관련이있다. $ 만이 인덱스에서 사용하지 못할 키 (필드)에 관련되어 존재입니다.

    $는 주어진 키 (또는 필드) 문서에 존재하는지 여부 단지를 검증 존재한다.

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

    2.$ 존재하는 인덱스를 사용하지 않습니다,하지만 당신은 당신의 데이터 구조를 변경할 수 있습니다

    $ 존재하는 인덱스를 사용하지 않습니다,하지만 당신은 당신의 데이터 구조를 변경할 수 있습니다

    photos: [
         {id:123, url: '...', title: '...', ... },
         {id:456, url: '...', title: '...', ... },
         ...
      ]
    

    다음 사용

    db.users.ensureIndex({photos.id:1}) 
    

    사진 ID에 대한 인덱스를 만들 수 있습니다.

    내가 사실, 당신은 당신의 $ 쿼리가 인덱스를 사용하기 위해 존재 강제로 잘못입니다 보인다. 우리가 위의 구조를 사용하여 가자,하지만 사진이 부착 된 신분증이 확실히 포함되지 않은, 그 말을하는 것입니다 일부 문서는 키 '아이디'를해야합니다 일부는하지 않습니다. 그럼 당신은 거기에 스파 스 인덱스를 생성 할 수 있습니다 :

    db.users.ensureIndex({'photos.id': 1}, {'sparse': true})
    

    다음과 같이 쿼리 :

    db.users.find({'photos.id': {$exists: true}}).hint({'photos.id': 1})
    

    당신은 쿼리가 인덱스를 사용하고 있는지 설명 추가 할 수 있습니다. 여기 내 결과는, 내 컬렉션의 모바일 키는 photos.id과 유사합니다 :

    > db.test.count()
    50000
    > db.test.find({'mobile': {$exists: true}}).hint({'mobile': 1}).explain()
    {
            "cursor" : "BtreeCursor mobile_1",
            "nscanned" : 49999,
            "nscannedObjects" : 49999,
            "n" : 49999,
            "millis" : 138,
            "nYields" : 0,
            "nChunkSkips" : 0,
            "isMultiKey" : false,
            "indexOnly" : false,
            "indexBounds" : {
                    "mobile" : [
                            [
                                    {
                                            "$minElement" : 1
                                    },
                                    {
                                            "$maxElement" : 1
                                    }
                            ]
                    ]
            }
    }
    
    > db.test.getIndexes()
    [
            {
                    "v" : 1,
                    "key" : {
                            "_id" : 1
                    },
                    "ns" : "test.test",
                    "name" : "_id_"
            },
            {
                    "v" : 1,
                    "key" : {
                            "mobile" : 1
                    },
                    "ns" : "test.test",
                    "name" : "mobile_1",
                    "sparse" : true,
                    "background" : true
            }
    ]
    

    도움말을 희망!

  3. ==============================

    3.MongoDB를 이후 2.0 $ 쿼리가 인덱스를 사용한다 존재한다. 불행하게도이 수정 프로그램은 최신 버전에서 사라지고 MongoDB를 2.5에서 수정 될 예정입니다

    MongoDB를 이후 2.0 $ 쿼리가 인덱스를 사용한다 존재한다. 불행하게도이 수정 프로그램은 최신 버전에서 사라지고 MongoDB를 2.5에서 수정 될 예정입니다

  4. from https://stackoverflow.com/questions/8176310/can-mongodb-use-an-index-when-checking-for-existence-of-a-field-with-exists-ope by cc-by-sa and MIT license