2012-02-05 3 views
5

개체에 중첩 배열이있는 컬렉션이 mongodb에 있다고 가정 해 보겠습니다. 배열의 특정 요소 값에 따라 정렬하고 싶습니다. 이것이 가능한가?Mongo에서 중첩 배열 내의 요소로 정렬 할 수 있습니까?

예를 들어 (내가 방금 만든 예제), 사용자가 제출 한 동영상 유형 (액션, 코미디, 로맨스) 및 예제가있는 경우 지정된 사용자가 제출 한 모든 개체를 찾을 수 있습니까? 영화 날짜?

예를 들어, 'Aaron'이 예제를 제출 한 'Aaron'예제의 연도별로 정렬 된 모든 유형을 찾고 싶습니다.

거의 비슷한 종류의 절이 필요합니다.

> db.movies.find(). pretty();

{ 
    "_id" : ObjectId("4f2f07c1ec2cb81a269362c6"), 
    "type" : "action", 
    "examples" : [ 
     { 
      "title" : "Gladiator", 
      "year" : 2000, 
      "submitter" : "Aaron" 
     }, 
     { 
      "title" : "Mission Impossiple", 
      "year" : 1996, 
      "submitter" : "Bill" 
     }, 
     { 
      "title" : "The Terminator", 
      "year" : 1984, 
      "submitter" : "Jane" 
     } 
    ] 
} 
{ 
    "_id" : ObjectId("4f2f07edaee5d897ea09f511"), 
    "type" : "comedy", 
    "examples" : [ 
     { 
      "title" : "The Hangover", 
      "year" : 2009, 
      "submitter" : "Aaron" 
     }, 
     { 
      "title" : "Dogma", 
      "year" : 1999, 
      "submitter" : "Bill" 
     }, 
     { 
      "tile" : "Airplane", 
      "year" : 1980, 
      "submitter" : "Jane" 
     } 
    ] 
} 

> db.movies.find ({ 'examples.submitter': '아론'}) 종류.. ({ 'examples.year': 1}) 꽤(); 문서가 (예상대로) 컬렉션 년으로 분류 반환

{ 
    "_id" : ObjectId("4f2f07edaee5d897ea09f511"), 
    "type" : "comedy", 
    "examples" : [ 
     { 
      "title" : "The Hangover", 
      "year" : 2009, 
      "submitter" : "Aaron" 
     }, 
     { 
      "title" : "Dogma", 
      "year" : 1999, 
      "submitter" : "Bill" 
     }, 
     { 
      "tile" : "Airplane", 
      "year" : 1980, 
      "submitter" : "Jane" 
     } 
    ] 
} 
{ 
    "_id" : ObjectId("4f2f07c1ec2cb81a269362c6"), 
    "type" : "action", 
    "examples" : [ 
     { 
      "title" : "Gladiator", 
      "year" : 2000, 
      "submitter" : "Aaron" 
     }, 
     { 
      "title" : "Mission Impossiple", 
      "year" : 1996, 
      "submitter" : "Bill" 
     }, 
     { 
      "title" : "The Terminator", 
      "year" : 1984, 
      "submitter" : "Jane" 
     } 
    ] 
} 

주 - 특정 사용자가 제출 단지 그 기준으로 정렬 할 수있는 방법? 내가 nodejs를 위해 노드 - 원주민 mongo 드라이버를 사용하고있는 약간의 세부 사항을 위해.

답변

5

... 주어진 사용자가 제출 한 것만으로 정렬 할 수 있습니까?

나는 이것이 당신이 원하는 방식으로 작동하지 않을 것이라고 생각하지 않습니다.

MongoDB에서 쿼리는 전체 문서를 반환합니다. 다음 조회를 수행하면 제출자가 'Aaron'과 일치하는 모든. 서를 찾습니다. 'Aaron' 이론적으로 같은 문서 내에서 두 번 일치하지만, 한 번만 해당 문서를 반환 할 수

> db.movies.find({'examples.submitter': 'Aaron'}) 

참고. 이것은 정렬 문제를 복잡하게합니다. 하나 개의 문서가 다른 년 'Aaron'에 의해 두 가지가 포함되어있는 경우

> db.movies.find({'examples.submitter': 'Aaron'}).sort({'examples.year': 1}) 

그래서 당신은 무엇을 기대 하는가? 우리는 문서 만 정렬 할 수 있다는 것을 기억하고 쿼리를 사용하여 내부 배열을 정렬 할 수 없습니다.

여기서 문제는 전체 프로세스를 복잡하게하는 "개체 배열"을 사용하고 있다는 것입니다. 귀하의 정렬 문제는 우리가 내적 사물에 작용할 수 있고 실제로는 그렇게 할 수 없다고 가정합니다.

당신이 찾고있는 것을 제공 할 수있는 새로운 Aggregation Framework을보십시오. 이것은 현재 불안정한 지점의 기능입니다.

{'examples.submitter': 1, 'examples.year': 1} 

당신이 힌트 ("INDEXNAME")를 사용하여이 인덱스를 사용하도록 쿼리를 강제하는 경우

:

+0

나는 그것을 할 수있을 것이라고는 생각하지 않았지만 그것이 가치가 있다고 생각했습니다. 당신이 언급 한 Aggregation Framework이 준비되었거나 안정적 일 때처럼 나를 데려다 줄 것 같아서 기쁩니다. 감사! – Zugwalt

0

귀하의 경우, server side에서 eval을 사용하고 맞춤 정렬을 수행해야합니다. 정렬에 대한 구체적인 예는 here을 참조하십시오. 제출자별로 "예제"배열과 필터를 통과해야하기 때문에 비교 함수가 좀 더 복잡해집니다.

1

이시의 경우 다른 사람 비틀 거림에, 내가 좋아하는 인덱스를 작성하여 유사한 문제를 해결할 수 있었다 결과가 색인 순으로 돌아옵니다.

+0

그 파일을 어디에 두 었는지/어떻게 작동하는지 더 자세히 설명해 주시겠습니까? 나는 또한 여기에있는 것과 매우 비슷한 문제로 고심하고있다. – ritmatter

+1

컬렉션에서 .ensureIndex를 사용해야합니다. 대개 mongo db ide 또는 명령 행에서이 작업을 수행합니다. http://docs.mongodb.org/manual/reference/method/db.collection.ensureIndex/ 힌트를 위해 mongodb http://docs.mongodb.org/manual/reference/operator/meta/hint/ 또는 mongoose를 사용하여 쿼리에서 힌트 함수를 사용하십시오. query.hint ({indexA : 1, indexB : -1}) –

관련 문제