2011-04-24 2 views
1

Mongo를 처음 접했을 때 나는 꽤 이해하지 못합니다.
왜 test2 컬렉션의 다음 항목에 대해 첫 번째 쿼리는 작동하지만 두 번째 쿼리는 작동하지 않습니다.
그리고 왜 쿼리가 나에게 사용자의 전체 내용이 아닌 오직 사용자의 _id만을 제공하는 반면, 사용에 대한 모든 정보를 사용자에게 제공하는 이유는 무엇입니까?MongoDB 쿼리 질문 : 한 필드의 선택 영역에 값이 있고 다른 필드가 설정되어 있지 않은지 어떻게 표현해야합니까?

조회 :

db.test2.find({"invitations.acceptedDate": {$exists: false}}, {"invitations.code":"codeAA"}) 
db.test2.find({"invitations.code":"codeAA"}, {"invitations.acceptedDate": {$exists: false}}) 

가 몽고에서 쿼리를 표현의도 올바른 방법인가? 내가 쓰기 위해 노력하고있어 쿼리는 다음과 같습니다

"나에게 코드 초대장 (AN acceptedDate를 포함하지 않는 초대) 주장하지 않은 'codeAA'를 사용하여 초대장을 보낸 사용자의 목록을 제공하십시오"

데이터 :

[{ 
    "username": "userA", 
    "password": "secretA", 
    "invitations": [{ 
     "code": "codeAA", 
     "emailSentTo": "[email protected]", 
    },{ 
     "code": "codeAB", 
     "emailSentTo": "[email protected]", 
     "acceptedDate": "20110424" 
    }]}, 
{ 
    "username": "userB", 
    "password": "secretB", 
    "invitations": [{ 
     "code": "codeBA", 
     "emailSentTo": "[email protected]", 
    },{ 
     "code": "codeBB", 
     "emailSentTo": "[email protected]", 
    }]}, 
{ 
    "username": "userC", 
    "password": "secretC", 
    "invitations": [{ 
     "code": "codeCA", 
     "emailSentTo": "[email protected]", 
    },{ 
     "code": "codeAA", 
     "emailSentTo": "[email protected]", 
     "acceptedDate": "20110424" 
    }]}, 
{ 
    "username": "userD", 
    "password": "secretD", 
    "invitations": [{ 
     "code": "codeDA", 
     "emailSentTo": "[email protected]", 
    },{ 
     "code": "codeDB", 
     "emailSentTo": "[email protected]", 
    }] 
}] 

건배

답변

5

당신이 find method을 w에 대한 MongoDB를 워드 프로세서로보고있는 경우 질의를 첫 번째 인수로, 두 번째 필드에서 선택할 필드의 목록을 기대합니다.

db.test2.find({"invitations.acceptedDate": {$exists: false}}, {"invitations.code":"codeAA"}) 

를 찾는 첫 번째 호출 그래서에만 "invitations.acceptedDate": {$exists: false}은 쿼리에 적용되지만 {"invitations.code":"codeAA"}는 조건의 일부가 아닙니다. 모든 조건을 하나의 쿼리 개체에 넣기를 원할 것입니다.

{ 
    "invitations.acceptedDate": {$exists: false}, 
    "invitations.code":"codeAA" 
} 

그리고 첫 번째이자 유일한 인수로 찾으십시오.

find의 두 번째 속성을 잘못 적용했기 때문에 사용자의 _id 만 가져올 수 있습니다.

편집 : 두 개 이상의 조건과 일치하는 단일 배열 요소가있는 문서를 사용하려면 $elemMatch을 사용하십시오. 귀하의 질문에 대한 그래서 :

" 가 초대가 이 주장되지 않은 코드 'codeAA'를 사용하여 초대장을 보낸 저에게 사용자의 목록을 제공하십시오 ( acceptedDate가 포함되어 있지 않습니다 초대)"를

쿼리에 무언가 같이해야한다 : 당신은 찾아 두 번째 매개 변수로 필드 필터를 통과하는

{ 
    invitations: { 
     $elemMatch: { 
      code: "codeAA", 
      acceptedDate: {$exists: false} 
     } 
    } 
} 
+0

아,이 결과가 왜 나는지 설명해 주셔서 감사합니다. :-) 그러나, 나는 하나의 쿼리 객체가 실제로 정확히 일치한다는 것을 알지 못한다. 코드가 codeAA이고 acceptedDate가없는 초대장이 없더라도 "userC"와 일치 할 것이다. – niklassaers

+0

@niklassaers 답변을 업데이트했습니다. – rocky3000

+0

대단히 감사합니다 .-) – niklassaers

2

(). 전체 쿼리는 항상 매개 변수 매개 변수로 전달됩니다.

관련 문제