2014-07-18 3 views
2

와 하위 문서 정렬 내가 한 :MongoDB의이 같은 MongoDB를 수집 알 수없는 이름

{ 
id: "213", 
sales : { 
    '2014-05-23': { 
     sum: 23 
    }, 
    '2014-05-22': { 
     sum: 22  
    } 
} 
}, 

{ 
id: "299", 
sales : { 
    '2014-05-23': { 
     sum: 44 
    }, 
    '2014-05-22': { 
     sum: 19  
    } 
} 
}, 

내가 에 쿼리를 찾고 있어요는 내 컬렉션에있는 모든 문서를 최대로 합 (문서로 정리 될 합계 상단에 ...). 이 같은 것을 돌려 예 데이터에

:

{ 
id: "299", 
sales : { 
    '2014-05-23': { 
     sum: 44 
    }, 
    '2014-05-22': { 
     sum: 19  
    } 
} 
}, 
{ 
id: "213", 
sales : { 
    '2014-05-23': { 
     sum: 23 
    }, 
    '2014-05-22': { 
     sum: 22  
    } 
} 
}, 

이유는 합계 44 가장 큰 따라서 컬렉션이 문서는 제 나타낸다.

그럴 수 있습니까? 다른 방법으로 데이터베이스를 재 설계 할 수 있습니다. 누군가가 제안을했을 수도 있습니다.

+0

"sum by sort"란 무엇을 의미합니까? 가장 큰 "합"값으로 모든 문서를 정렬 하시겠습니까? 또는 "sum"으로 각 문서의 "sales"를 정렬하고 싶습니까? 두 경우 모두 스키마를 실제로 변경해야합니다. –

+0

오,이 점을 지적 해 주셔서 감사합니다.이 질문을 명확히하기 위해 제 질문을 편집합니다. – mdunisch

+0

다시 한번. "문서"또는 "하위 문서"는 질문 된 내용입니다. 그래서 우리는 가장 큰 "sales.sum"에 의해 귀하의 컬렉션에있는 문서들을 모두 정렬하거나 ** 각 "** 문서"에 가장 큰 "sale.sum"이 먼저 나열되기를 원하십니까? 후자의 경우 문서 당 "모든 매출액 합계"를 의미할까요? 이 질문에 답하면 ** 명확한 ** 질문이됩니다. –

답변

2

성능이 좋지 않으며 집계 프레임 워크 인 최상의 옵션을 버리고 있기 때문에 성능이 좋지 않습니다.

큰 위반 사항은 "데이터를 키로 사용하지 마십시오"입니다.

실제로 "데이터"인 "키"를 사용하여 "하위 문서"의 이름을 지정하면 쉽게 처리 할 수 ​​없습니다. 일반적인 MongoDB 표기법은 이것을 좋아하지 않으며 JavaScript 평가를 강요 받고 있습니다. 이것은 여전히 ​​"spritely"이지만 실제로는 이 느림은 원시 메소드와 비교하여 느립니다.

스키마를 변경하면 집계 프레임 워크를 사용할 수 있습니다.

{ 
    "_id": 123, 
    "sales": [ 
     { "date": ISODate("2014-05-23T00:00:00Z"), "sum": 23 }, 
     { "date": ISODate("2014-05-22T00:00:00Z"), "sum": 22 } 
    ] 
}, 
{ 
    "_id": 299, 
    "sales": [ 
     { "date": ISODate("2014-05-22T00:00:00Z"), "sum": 19 }, 
     { "date": ISODate("2014-05-23T00:00:00Z"), "sum": 44 } 
    ] 
} 

이제 데이터를 배열하고 "경로"일치, 이것은 당신이 아주 쉽게 일을 정렬 할 수 있습니다 의미 : 여기에 첫 번째 변화는

db.collection.find().sort({ "sales.sum": -1 }) 

그래서 문서로 " 가장 큰 ""sales.sum "값이 첫 번째가됩니다.

db.collection.aggregate([ 
    { "$unwind": "$sales" }, 
    { "$sort": { "_id": 1, "sales.sum": -1 } }, 
    { "$group": { 
     "_id": "$_id", 
     "sales": { "$push": "$sales" } 
    }}, 
    { "$sort": { "sales.sum": -1 } } 
]) 

현재 서류 : 다음 위의 예제를 제공하는 경우

, 당신은 "일종의"최대 "sales.sum"에 의해 내부 배열 요소뿐만 아니라, 당신은 집계 프레임 워크를 사용할 수 있습니다 싶어 mapReduce로 JavaScript 평가를 사용하면 이런 식으로 처리 할 수 ​​있지만 훨씬 느려지므로 그렇게하지 마십시오.

+0

놀라운 - 그 상세한 답변에 감사드립니다. 나는 좋은 제안 인 스키마를 바꿀 것이다. 우리가 열쇠의 자료를 필요로하는 단 하나의 점이 있고 그것을 다시 쓸 수 있습니다. – mdunisch