2014-09-10 1 views
2

저는 mongodb을 처음 사용합니다. 최근에 기본 구문을 배우기 시작했습니다. find 메서드를 사용하여 연산자를 사용하려고했는데 암시 적 AND를 시도하는 동안 혼란스러운 경우가 발생했습니다.몽고 DB에서 메서드의 혼동을 암시 적으로 발견했습니다.

내 컬렉션 mathtable 다음과 같이가 400 문서를 갖는

mathtable 컬렉션의 400 개 행이
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b2") , "index" : 1 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b3") , "index" : 2 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b4") , "index" : 3 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b5") , "index" : 4 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b6") , "index" : 5 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b7") , "index" : 6 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b8") , "index" : 7 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b9") , "index" : 8 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4ba") , "index" : 9 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4bb") , "index" : 10 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4bc") , "index" : 11 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4bd") , "index" : 12 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4be") , "index" : 13 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4bf") , "index" : 14 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c0") , "index" : 15 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c1") , "index" : 16 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c2") , "index" : 17 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c3") , "index" : 18 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c4") , "index" : 19 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c5") , "index" : 20 } 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4d1") , "index" : 1 } 
.. 
.. 
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4z5") , "index" : 20 } 

: 1 to 20에서 index 범위의

  • 값입니다.
  • index의 각 값에 대해 서로 다른 _id 값을 갖는 20 항목이 있습니다.

나는 둘 다 implicit AND 경우를 고려하여 두 가지 작업을 시도하고 동일한 결과가 예상됩니다. 값 (160 개 레코드에 대한 검색 결과)보다 큰 제

  • 고전 EXPLICIT AND 사용 데에도 index 값 계산

    : 번만 변수 명을 사용

    db.mathtable.count({ 
          $and: [ 
          { index: { $mod: [2,0] } },   
          { index: { $gt: 5 } }  
          ] 
         }); 
    
  • 을 (결과 (160)에 기록) :

    db.mathtable.count({ 
            index : { $mod : [2,0] , $gt:5 } 
            }); 
    
  • ,515,
  • 모든 조건의 필드 이름을 사용하여 (300 개 레코드에 결과) 각 조건의 필드 명을 사용

    db.mathtable.find({ 
            index : { $mod : [2,0]} , 
            index : {$gt:5} 
           }); 
    
  • 반대 순서 상태 (200 개 레코드에 대한 검색 결과) :

    db.mathtable.find({ 
            index : {$gt:5} , 
            index : { $mod : [2,0]} 
           }); 
    

는 MongoDB의 설명서 implicit OR에 대한 언급이 없다 (또는-적어도 나는 implicit AND 같은 직접 참조를 찾을 수 없습니다).

나는 두 경우 모두 기록 (160)의 동일한 수를 기다리고 있었다. 위 코드가 왜 다르게 작동하는지 이해할 수 없습니다.

또한 조건 지정의 결과로 상이한 수 결과 순서. 관측에 따라 동일한 필드가 여러 번 지정된 경우 find에 지정된 마지막 조건 만 적용되었습니다. 이상하고 잘못되었습니다.

참고 : 나는 Mongo-DB-2.6을 사용하고 코드가 배포되어 mongo shell에서 실행되고있다.

db.mathtable.find({ 
        index : { $mod : [2,0]} , 
        index : {$gt:5} 
       }); 

상기 간주된다 당량 :

답변

3

JSON 또는 연관 배열 또는지도 does not 중복 키가 포함되어, 제 조건 덮어 쓸

db.mathtable.find({ 
        index : {$gt:5} 
       }); 

및 아래,

db.mathtable.find({ 
        index : {$gt:5} , 
        index : { $mod : [2,0]} 
       }); 
,

그러나 제 경우

db.mathtable.find({ 
        index : { $mod : [2,0]} 
       }); 

,

db.mathtable.count({ 
      $and: [ 
      { index: { $mod: [2,0] } },   
      { index: { $gt: 5 } }  
      ] 
     }); 

$ 및 입력으로 두 JSON 문서 걸리는 예상대로 작동에 상응하는 것이다.

두 번째 경우 count는 중복 키가없는 단일 문서를 취해 예상대로 작동합니다.

db.mathtable.count({ 
        index : { $mod : [2,0] , $gt:5 } 
        }); 

따라서 행 수의 차이가 반환됩니다. 희망이 도움이됩니다.

+0

이유를 이해하는 데 많은 도움이됩니다. –

관련 문제