2011-10-26 3 views
2

복합 인덱스 컬렉션의 mongo 셸에서 ensureIndex를 호출하면 ObjectId 유형의 _id 필드가 인덱스 개체에서 자동 생성됩니다.인덱스 개체의 _id 필드에 복합 키가있는 ensureIndex 호출

> db.system.indexes.find(); 
{ "name" : "_id_", "ns" : "database.coll", "key" : { "_id" : 1 } } 
{ "_id" : ObjectId("4ea78d66413e9b6a64c3e941"), "ns" : "database.coll", "key" : { "a.b" : 1, "a.c" : 1 }, "name" : "a.b_1_a.c_1" } 

이 콜렉션에있는 모든 문서는 _id 필드 필요로하는 (심지어 system.indexes를? 오른쪽) 직관적으로 이해되지 않는다,하지만 난 같은 컬렉션에 대한 모르핀의 ensureIndex 호출에 의해 생성 된 인덱스를 확인할 때 더가있다 * _id 속성 *.

morphia의 소스 코드를 보면, 쉘이 사용하는 코드와 동일한 코드를 호출하지만, 어떤 이유로 (복합 인덱스를 만들거나 임베디드 문서 또는 두 가지 모두를 인덱싱하는지 여부와 상관없이) 생성됩니다. 다른 결과. 아무도 나 에게이 동작을 설명 할 수 있습니까?

답변

1

회원님이 인덱스 수집에 _id 필드하지만 모두 쉘을 관리하고 모르핀이 복합 인덱스는 인덱스 오브젝트에 _id 필드를 넣지 마십시오에 대한 ensureIndex 호출 유래하는 방법을 정확히 확인하십시오

> db.test.ensureIndex({'a.b':1, 'a.c':1}) 
> db.system.indexes.find({}) 
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.test", "name" : "_id_" } 
{ "v" : 1, "key" : { "a.b" : 1, "a.c" : 1 }, "ns" : "test.test", "name" : "a.b_1_a.c_1" } 
> 

업그레이드에 2.x에서 이전 버전을 실행 중이므로 지금 해결 된 문제가 발생하지 않도록하십시오. 그리고 출력을 판단하면 1.8 또는 이전 버전을 실행 중입니다.

+0

고맙습니다. morphia가 색인을 작성한 mongod 버전은 쉘이 연결 한 버전보다 최신 버전입니다. brew는 고대 1.6.3을 설치했고 mongo 명령은 이전에 $ PATH에 해당 버전을 지정했습니다. – jpredham

+0

너 거기 간다;) –