2013-10-08 3 views
1

db.collection.find()를 사용하여 하위 문서의 특정 값을 쿼리하고 일치하는 문서를 찾을 수 있습니까?하위 문서의 db.collection.find 쿼리 사용하기

{ { '조': {eyecolor} '갈색', { '마리아': {eyecolor} '블루', .... }

내가 원하는 예를 들어, 아이 컬러가 파란색 인 모든 사람들의 이름을 반환합니다.

db.people.find({ "Joe.eyecolor" : "brown" }) 

당신은 사람들의 배열 대신에 당신이 지금 사용하고있는 연관 배열 스타일로 전환 할 수 없습니다, 거기 : 검색 작업을 위해

+0

같은 결과를 제공합니다

{ "_id" : 132, "ppl" : [ { "Name" : "John", "eyecolor" : "blue" }, { "Name" : "Mary", "eyecolor" : "brown" }, ... ] } 

그런 다음 통합 프레임 워크를 사용하여 조회 할 수 있습니다 –

답변

3

당신은 값의 전체 경로를 지정해야합니다 조건과 일치하는 배열 요소 만 반환하는 방법은 없습니다. $elemMatch을 사용하여 첫 번째로 일치를 반환 할 수 있지만 원하는 것은 아닙니다. 또는 여전히 배열을 사용할 수 있지만 데이터베이스가 아니라 클라이언트 코드 내에서 배열을 더 필터링해야합니다.

집합 프레임 워크를 사용할 수도 있지만 전체 배열 $unwind을 필요로하므로 인덱스를 효율적으로 사용하지 않아도됩니다. 그리고 포함 된 데이터가 더 복잡한 경우, AF를 사용할 때의 투영에 수동으로 모든 필드를 지정해야하므로 약간 번거로워집니다.

가장 효율적으로 게재하고있는 쿼리를 수행하려면 하위 문서를 사용하는 대신 개별 문서로 사람들을 놓지해야 할 것 : 그런 다음

{ 
    name: "Joe", 
    eyecolor: "brown" 
} 

, 당신은 간단한 검색 등을 할 단지 수 :

db.people.find({eyecolor: "brown"}) 
0

예. 아니오. 일치하는 사람이있는 모든. 서를 조회 할 수 있지만 모든 개인을 직접 u 리할 수는 없습니다. 즉, 하위 문서는 가상 컬렉션이 아니므로 항상 '상위'문서가 반환됩니다.

게시 한 예에는 이름을 필드 키로 사용하는 추가 복잡성이있어서 점 표기법을 사용할 수 없습니다.

일반적으로 비슷한 항목이 많으면 목록에 넣는 것이 가장 좋습니다.

db.collection.aggregate([ 
// only match documents that have a person w/ blue eyes (can use indexing) 
{$match : { "ppl.eyecolor" : "blue" } }, 
// unwind the array of people 
{$unwind : "$ppl" }, 
// match only those with blue eyes 
{$match : { "ppl.eyecolor" : "blue" }}, 
// optional projection to make the result a list of people 
{$project : { Name : "$ppl.Name", EyeColor: "$ppl.eyecolor" }} ]); 

이것은 아주 나쁜 디자인

"result" : [ 
    { 
      "_id" : 132, 
      "Name" : "John", 
      "EyeColor" : "blue" 
    }, 
    { 
      "_id" : 12, 
      "Name" : "Jimmy", 
      "EyeColor" : "blue" 
    }, 
    { 
      "_id" : 4312, 
      "Name" : "Jimmy", 
      "EyeColor" : "blue" 
    }, 
    { 
      "_id" : 4312, 
      "Name" : "Marc", 
      "EyeColor" : "blue" 
    } 
], 
"ok" : 1 
관련 문제