복붙노트

[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. ==============================

    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"을 고려하여 정렬 순서의 맨 위에있는 첫 번째 문서를 배치합니다.

  2. from https://stackoverflow.com/questions/35374433/sorting-by-maximum-array-field-ascending-or-descending by cc-by-sa and MIT license