[MONGODB] 최대 배열 필드, 오름차순 또는 내림차순으로 정렬
MONGODB최대 배열 필드, 오름차순 또는 내림차순으로 정렬
내 유성 응용 프로그램에서 나는 하위 문서의 배열 문서의 컬렉션이 그 같이 :
/* 1 */
{
"_id" : "5xF9iDTj3reLDKNHh",
"name" : "Lorem ipsum",
"revisions" : [
{
"number" : 0,
"comment" : "Dolor sit amet",
"created" : ISODate("2016-02-11T01:22:45.588Z")
}
],
"number" : 1
}
/* 2 */
{
"_id" : "qTF8kEphNoB3eTNRA",
"name" : "Consecitur quinam",
"revisions" : [
{
"comment" : "Hoste ad poderiquem",
"number" : 1,
"created" : ISODate("2016-02-11T23:25:46.033Z")
},
{
"number" : 0,
"comment" : "Fagor questibilus",
"created" : ISODate("2016-02-11T01:22:45.588Z")
}
],
"number" : 2
}
내가 뭘 원하는이 컬렉션 및 개정 배열의 생성 된 필드의 최대 날짜순 정렬 결과 집합 쿼리입니다. 뭔가 아직 해낼 수 없었다. 내가 가진 몇 가지 제약 조건은 다음과 같습니다 :
해결법
-
==============================
1.당신이 여기에서 요구하는 것과 기본적인 문제는 해당 데이터가 "배열"내 사실에 내려 오는, 따라서이이 처리되는 방식에로 MongoDB를 만든 몇 가지 기본적인 가정이있다.
당신이 여기에서 요구하는 것과 기본적인 문제는 해당 데이터가 "배열"내 사실에 내려 오는, 따라서이이 처리되는 방식에로 MongoDB를 만든 몇 가지 기본적인 가정이있다.
당신이 다음 MongoDB를 정확히 물어 무엇을 할 것 "내림차순"에 정렬을 적용하면 배열 내의 지정된 필드의 "큰"값을 기준으로 정렬 문서 :
.sort({ "revisions.created": -1 ))
그러나 일종의 "오름차순"순서로 대신하는 경우 다음 물론 반대의 사실과 "작은"값으로 간주됩니다.
.sort({ "revisions.created": 1 })
어레이의 데이터로부터 최대 기간 인 운동이 방법을 수행 한 후 그 결과를 분류하는 유일한 방법 그래서. 이것은 기본적 유성 불행히도이 같은 인, 서버 측의 동작이다 .aggregate ()를 적용하는 수단 :
Collection.aggregate([ { "$unwind": "$revisions" }, { "$group": { "_id": "$_id", "name": { "$first": "$name" }, "revisions": { "$push": "$revisions" }, "number": { "$first": "$number" } "maxDate": { "$max": "$revisions.created" } }}, { "$sort": { "maxDate": 1 } ])
또는 $ 최대 배열 식에 직접 적용 할 수 MongoDB를 3.2과 최상의 :
Collection.aggregate([ { "$project": { "name": 1, "revisions": 1, "number": 1, "maxDate": { "$max": { "$map": { "input": "$revisions", "as": "el", "in": "$$el.created" } } } }}, { "$sort": { "maxDate": 1 } } ])
하지만 실제로 둘 수없는 위대한는 MongoDB를 3.2 접근 방식으로 적은 오버 헤드 이전 버전에 가능한 것이 무엇인지, 당신이 때문에 데이터와 업무를 통과 할 필요성에 성능면에서 얻을 수있는 좋은으로 아직도보다는있는 경우에도 값에서에 정렬합니다.
그래서 최적의 성능을 위해, "항상"당신이 필요로 배열의 "외부"가는 이러한 데이터를 유지합니다. 이를 위해 제공된 값이 이미 기존 값 "보다" "만일"단지 문서 내에서 값을 대체 할 $ 최대 "갱신"연산자가있다. 즉 :
Collection.update( { "_id": "qTF8kEphNoB3eTNRA" }, { "$push": { "revisions": { "created": new Date("2016-02-01") } }, "$max": { "maxDate": new Date("2016-02-01") } } )
그것은 해당 필드에 정렬하는 간단한 문제가 지금 바로 그래서 당신이 원하는 값이 "항상", 기대 값으로 문서 내에서 이미 존재하는 것으로이 방법 :
.sort({ "maxDate": 1 })
기존 사용할 수있는 .aggregate () 문 중 하나에 데이터 및이 "maxDate"필드를 포함하는 각 doccument를 업데이트하는 결과를 사용하지만 그래서 내 돈을 위해, 나는 갈 것입니다. 그런 다음 모든 변화가 $ 최대 "업데이트"를 적용 할 모든 추가 및 배열 데이터의 수정의 코딩을 변경합니다.
당신이 자주 그것을 사용하는 경우 계산은 항상 훨씬 더 의미보다는 고체 필드를 가졌어요. 그리고 유지 보수가 매우 간단합니다.
어떤 경우에는, 다른 최대 날짜 존재하는 모든 형태의 나를 위해 반환 "보다 적은"입니다 위의 응용 예를 들어 날짜를 고려 :
{ "_id" : "5xF9iDTj3reLDKNHh", "name" : "Lorem ipsum", "revisions" : [ { "number" : 0, "comment" : "Dolor sit amet", "created" : ISODate("2016-02-11T01:22:45.588Z") } ], "number" : 1, "maxDate" : ISODate("2016-02-11T01:22:45.588Z") } { "_id" : "qTF8kEphNoB3eTNRA", "name" : "Consecitur quinam", "revisions" : [ { "comment" : "Hoste ad poderiquem", "number" : 1, "created" : ISODate("2016-02-11T23:25:46.033Z") }, { "number" : 0, "comment" : "Fagor questibilus", "created" : ISODate("2016-02-11T01:22:45.588Z") }, { "created" : ISODate("2016-02-01T00:00:00Z") } ], "number" : 2, "maxDate" : ISODate("2016-02-11T23:25:46.033Z") }
어떤 올바르게 "maxDate"을 고려하여 정렬 순서의 맨 위에있는 첫 번째 문서를 배치합니다.
from https://stackoverflow.com/questions/35374433/sorting-by-maximum-array-field-ascending-or-descending by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] ID의 목록을 감안할 때, IDS 컬렉션에 존재하지 않는 쿼리하는 가장 좋은 방법은 무엇입니까? (0) | 2019.12.27 |
---|---|
[MONGODB] 봄 필터 집합 만들기 (0) | 2019.12.27 |
[MONGODB] mongoexport JSON 구문 분석 오류 (0) | 2019.12.27 |
[MONGODB] 여러 언어를 사용하여 MongoDB를 텍스트 검색 (0) | 2019.12.27 |
[MONGODB] 해당 조건과 일치하는 배열 요소 개수 (0) | 2019.12.27 |