[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.아니, 쿼리를 존재에 대한 사용 지수에 MongoDB를 말할 수있는 방법이 없습니다. 인덱싱은 완전히 데이터 관련이있다. $ 만이 인덱스에서 사용하지 못할 키 (필드)에 관련되어 존재입니다.
아니, 쿼리를 존재에 대한 사용 지수에 MongoDB를 말할 수있는 방법이 없습니다. 인덱싱은 완전히 데이터 관련이있다. $ 만이 인덱스에서 사용하지 못할 키 (필드)에 관련되어 존재입니다.
$는 주어진 키 (또는 필드) 문서에 존재하는지 여부 단지를 검증 존재한다.
-
==============================
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.MongoDB를 이후 2.0 $ 쿼리가 인덱스를 사용한다 존재한다. 불행하게도이 수정 프로그램은 최신 버전에서 사라지고 MongoDB를 2.5에서 수정 될 예정입니다
MongoDB를 이후 2.0 $ 쿼리가 인덱스를 사용한다 존재한다. 불행하게도이 수정 프로그램은 최신 버전에서 사라지고 MongoDB를 2.5에서 수정 될 예정입니다
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
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB의 결과를 제한하지만 여전히 전체 수를 점점? (0) | 2019.12.15 |
---|---|
[MONGODB] 중첩 된 문서에 의해 MongoDB를 통합 프레임 워크 일치 (0) | 2019.12.15 |
[MONGODB] 몽고 업데이트 배열 요소 (.NET 드라이버 2.0) (0) | 2019.12.14 |
[MONGODB] findOneAndUpdate가 returnNewDocument과 함께 사용했을 때 true를 돌려줍니다 원본 문서 MongoDB를 (0) | 2019.12.14 |
[MONGODB] 어떻게 배열에서 중복 된 항목을 제거하려면? (0) | 2019.12.14 |