2011-01-29 10 views
0

MongoDB를 사용하여 많은 정보를 저장하고 인덱스 배열에서 값을 검색해야합니다.MongoDB 배열 인덱스 검색

다음은 스키마의 : 문서에 다른 값이 있습니다

{ "common_name" : { "name" : "thename", "type" : "thetype" } } 

, 그러나 이것은 내가 찾고 있어요 유일한 하나입니다.

그래서, 나는이 일 것 같은 것을 생각 : (쉘에서)

db.collection.find({common_name:{$in:"thename"}}) 

을하지만 다시 아무 것도 얻을 수 없습니다.

이것은 정확히 여기 보이는 것처럼 보입니다. http://www.php.net/manual/en/mongo.queries.php -하지만 나는 아무것도 얻을 수없는 것 같습니다.

, 그것은 기본적으로 각 하위 범주에 대한 $ 또는 인덱스를 정의, 추한 얻을 수, 나는

db.collection.find({"common_name.name":"thename"}}) 

시도하고 예상대로 작동하지만 (최대 4) 인덱스에 여러 노드를 검색 내 쿼리 시간을 4 배로 늘릴 수 있습니다. 이것이 자동 완성기에 힘을 불어 넣는 것이지, 나는 그것을 할 수 없다.

이상하게도 다음이 문서를 반환하지 않습니다 중 하나 : 나의 이해에 정확히 위의 쿼리와 같은 일이

db.collection.find({"common_name":{"name":"thename"}}) 

.

나는 꽤 몽고를 처음 보았습니다. 그래서 여기에 큰 무언가가 없어 졌을까요?

고정 된 정규식을 사용하여이 데이터에 가장 빨리 액세스하는 방법에 대한 아이디어가 있으십니까?

나는 관계형 테이블을 사용할 수는 있지만 Mongo와 같은 NoSQL 시스템의 목적을 상회하지는 않습니까?

답변

2

문제는 배열이 없다는 것입니다. 배열은 다음과 같을 것입니다 { "common_name" : [ "name1", "name2", "name3" ] }

이와 같은 구조로 Mongo는 배열의 요소를 단일 색인으로 색인화하고 배열의 단일 항목을 포함하는 모든 문서를 신속하게 찾을 수 있습니다.

은 배열을 사용하여 오프셋을 원하는대로 정의 할 수 있습니다 (예 : [0]은 이름이고 [1]은 유형입니다. 이제 그 문서를 빠르게 찾을 수 있습니다.

당신은 명명 된 필드의 데이터를 유지뿐만 아니라에 (그러나 명확하게이 증가 할 것 저장하지 않는 것이 좋습니다)를 할 수 있습니다.

대신 실행할 수 있습니다 최신 컬렉션에 추가 된 최신 문서와 자동 완성 완전히 할 필요가없는 경우

지도-감소 그냥 자동 완성 사용 별도의 수집을 구축 할 작업을. 지도 단계는 문서의 각 개별 이름 필드에 대해 방출하므로 (배출 후 4 배의 문서가 늘어남) 감축 단계는 각 이름의 개수를 계산합니다 (모든 필드에서 고유 한 이름의 수를 1 배로 늘림) .결과 모음을 이름과 개수로 색인화하여 자동 완성에서 가장 일반적인 이름을 먼저 추천 할 수 있습니다.

+0

아, 그게 문제가 될지 걱정되었습니다. 그런 식으로 스키마를 바꿀 것입니다. 나는 http://www.php.net/manual/en/mongo.queries.php에서 php docs를 오해했거나 틀렸다. 감사! – Jesse

+0

와우, 배열로 변환 한 후 몇 가지 explain()을 실행했습니다. 고정 된 정규식을 사용하여 배열을 검색하는 데 55ms가 걸렸습니다. 색인을 생성 한 후에는 2로 줄었습니다. 꽤 놀랍습니다. – Jesse

+0

@Jesse - 색인을 한 번 잊어 버렸습니다. 내 컬렉션에 거의 백만 건의 문서가있을 때까지 알리지 못했습니다! 색인이 추가되었으며 몇 밀리 초로 돌아갔습니다. –

0

db.collection.find({"common_name":{"name":"thename"}}) 나는 위의 쿼리와 정확히 동일합니다. common_name의 값이 단지 name: thename} 될 것이라고있을 경우에만 일치하기 때문

이 아니, 아니에요, 당신은 $elemMatch 연산자를 원한다.