2016-08-25 2 views
0

아래 필드 2 개가있는 내 문서의 복합 키로 _id 필드를 사용하고 있습니다. 내 쿼리에서 함께 두 필드를 사용하는 경우 내가 그것을 발견 무엇 Mongodb _id 필드를 사용하여 하나 이상의 복합 필드에서 부분적으로 쿼리하기

{ 
    "_id" : { 
     "timestamp" : ISODate("2016-08-25T05:43:00.000-19:30"), 
     "hostName" : "nj" 
    } 

} 

는 난 단지 쿼리 수 있어요. 내가 그 중 하나를 사용하면 나는 어떤 문서도 돌려받지 못한다.

db.getCollection('sales').find(
{ 
    "_id" : { 
      "hostName" : "tryme"  
    } 

} 

db.getCollection('sales').find(
{ 
    "_id" : { 
      "timestamp" : ISODate("2016-08-25T05:43:00.000-19:30") 
    } 

} 

위의 스크립트는 어떤 문서도 반환하지 않습니다.

또한, 나는

db.getCollection('sales').find(
{ 
    "_id" : { 
     "timestamp" : { 
      "$lte":ISODate("2016-08-25T04:51:00.000-19:30") 
     }, 
     "hostName" : "tryme"  
    } 

} 

) 

은 위의도 모든 문서를 반환하지 않습니다, 날짜 필드에 $ GTE/$의 LTE 연산자를 사용할 수 없습니다입니다.

아래 쿼리는 작동하지만 explain()은 콜렉션 스캔을 사용하고 인덱스는 사용되지 않습니다.

db.getCollection('sales').find(
{ 
    "_id.timestamp" : ISODate("2016-08-25T04:51:00.000-19:30"), 
    "_id.hostName" : "tryme"  
} 

) 

== 

db.getCollection('sales').find(
{ 
    "_id.timestamp" : { 
     "$gte": ISODate("2016-08-25T04:52:00.000-19:30") 
    }, 
    "_id.hostName" : "tryme"  
} 

) 

확실하지 않은 경우 어떻게 _id 필드가 올바르게 작동하는지 이해했다면.

기본적으로 복합 쿼리의 부분 필드를 사용할 수 있고 _id 필드의 인덱스를 활용하여 동시에 /보다 큰/작은 것 같은 범위 쿼리에도 날짜 형식 필드를 사용할 수 있기를 원합니다.

누군가 나를 도와주세요.

감사

답변

0

스리

the docs 가입일 :

MongoDB의 배열의 요소를 액세스 할 점 표기법을 사용 는 임베디드 문서의 필드를 액세스 할.

중첩 된 개체를 같음과 일치하는 쿼리로 전달하기 때문에 첫 번째 시도가 작동하지 않습니다. 도트 표기법을 대신 사용하십시오.

+0

의견을 보내 주신 데 대해 감사 드리지만 점 스캔을 사용하면 색인을 사용하지 않고 컬렉션 스캔을 수행 할 수 있습니다. mongo 쉘에서 .explain() 메소드를 사용하여 검사했습니다.이 쿼리에 인덱스를 사용하고 싶습니다. – user6594900

+0

@ user6594900 false 인 경우 중첩 인덱스 (https://stackoverflow.com/questions/9730136/how-to-create-a-nested-index-in-mongodb)를 만들 수 있습니다. 복합 색인이있는 경우 해당 색인이 작동하도록하기 위해 모든 구성 요소를 질의해야합니다 – martriay

관련 문제