2014-10-08 5 views
2

listdictscollection이 있는데 어떤 dict에 두 개의 특정 key:values이 포함되어 있는지 검색하고 싶습니다.컬렉션의 목록에있는 각 dict을 검색합니다

그래서 예를 들어 find_one에 dict에 성과 이름이 들어 있기를 원합니다.

first = 'bob' 
last = 'smith' 

nameExists = db.user.find_one({'$and':[{'names.firstName':first,'names.lastName':last}]}) 

이 쿼리는 하나 개의 레코드를 검색 할 것인가 : 나는, 내가이 검색하고 이름과 성으로 밥 스미스와 기록이있는 경우로보고 싶은

{ 
"names": [ 
    { 
     "firstName": "bob", 
     "lastName": "jones", 
     "age": "34", 
     "gender": "m" 
    }, 
    { 
     "firstName": "alice", 
     "lastName": "smith", 
     "age": "56", 
     "gender": "f" 
    }, 
    { 
     "firstName": "bob", 
     "lastName": "smith", 
     "age": "19", 
     "gender": "m" 
    },   
    ] 
} 

: 이것은 내 모음입니다 밥 스미스?

답변

4

실제로는 $and 연산자가 필요하지는 않지만 어느 형식이든 원하는 쿼리가 아닙니다. 다음 고려 :

db.user.find_one({ 'names.firstName': 'alice','names.lastName': 'jones' }) 

이를 사실 에서 것은이 "firstName을"동일한 "앨리스"와 "이 lastName"값이 두 요소는이 "존스"동일로 주어진 레코드와 일치 않습니다. 하지만 여기에있는 문제는 어레이에 실제 값이 아닌 하위 문서가있는 요소가 없다는 점에서 간단합니다.

배열 요소에 주어진 기준이 둘 다 포함되어있는 경우 일치 시키려면 $elemMatch 연산자를 사용해야합니다. 쿼리 조건을 배열의 "요소"에 적용합니다.

db.user.find_one({ 
    'names': { '$elemMatch': { 'firstName': 'alice','lastName': 'smith' } 
}) 

그리고 당신은 "앨리스"를 시도하는 경우 물론

어떤 요소가 실제로 작업을 포함하지 않기 때문에 "존스"그가 일치하지 않습니다.

+0

감사합니다. 그 특정 하위 문서와 일치시키기를 원했던 것입니다. 나는'$ elemMatch'에 대해서도 읽을 것이다. – user94628

+1

일치하는 단일 요소 만 반환하려는 경우 [위치'$'] (http://docs.mongodb.org/manual/reference/operator/projection/positional/) 연산자 설명서를 참조하십시오. –

+0

감사합니다. – user94628

0

거의!

nameExists = db.user.find_one({'$and':[{'names.firstName':first},{'names.lastName':last}]}) 

물음표는 별도의 {} 괄호로 구분해야합니다.

0

$ 및 매개 변수를 추가하지 않아도됩니다. mongoDB에서 쿼리 내의 쉼표로 구분 된 필드는 implicit AND operator으로 결합되므로 find_one 내부의 {names.firstName ': first,'names.lastName ': last}를 사용하면됩니다.

어쨌든 "깨끗한 코드"수정 사항입니다. 요소 하나만 사용하여 "and"연산을 수행 할 때 코드가 제대로 작동합니다 (매개 변수 $에 사용 된 목록에는 하나의 사전 만 포함됨).

관련 문제