복붙노트

[MONGODB] 배열 요소에 의해 MongoDB를 정렬 문서

MONGODB

배열 요소에 의해 MongoDB를 정렬 문서

나는 문서 구조 등이있다 :

{
    map: 'A',
    points: [
        {
            type: 'type1',
            distanceToSpawn: 110
        },
        {
            type: 'type4',
            distanceToSpawn: 40
        },
        {
           type: 'type6',
           distanceToSpawn: 30
        }
    ]
},
{
    map: 'B',
    points: [
        {
            type: 'type1',
            distanceToSpawn: 100
        },
        {
            type: 'type2',
            distanceToSpawn: 60
        },
        {
            type: 'type3',
            distanceToSpawn: 25
        }
    ]
},
{
    map: 'C',
    points: [
        {
            type: 'type2',
            distanceToSpawn: 90
        },
        {
            type: 'type3',
            distanceToSpawn: 1
        },
        {
            type: 'type6',
            distanceToSpawn: 76
        }
    ]
}

나는 포인트 형 타입 1을 가진 모든 맵이 오름차순으로 distanceToSpawn으로 분류 싶어.

예상 결과 :

{
    map: 'B',
    points: [
        {
            type: 'type1',
            distanceToSpawn: 100
        }
    ]
},
{
    map: 'A',
    points: [
        {
            type: 'type1',
            distanceToSpawn: 110
        }
    ]
}

내가 좋아하는 뭔가를 시도했다 :

db.maps.find({'points.type': {$eq : 'type1'}}, {map: 1, 'points.$':1}).sort({'points.distanceToSpawn': 1}).limit(10)

그러나이 일이 오름차순으로지도를 정렬하지.

감사.

해결법

  1. ==============================

    1.당신은 배열 할 수 없어, 당신이 일치하는 요소에서 발생하는 "일종의"완 때문에 여기에 주요 문제입니다. 이 같은 결과를 정렬 할 경우 대신) (.aggregate를 사용해야합니다. 어느로 :

    당신은 배열 할 수 없어, 당신이 일치하는 요소에서 발생하는 "일종의"완 때문에 여기에 주요 문제입니다. 이 같은 결과를 정렬 할 경우 대신) (.aggregate를 사용해야합니다. 어느로 :

    현대 MongoDB의 버전 :

    db.maps.aggregate([
        { "$match": { "points.type": "type1" }},
        { "$addFields": {
            "order": {
                "$filter": {
                  "input": "$points",
                  "as": "p",
                  "cond": { "$eq": [ "$$p.type", "type1" ] }
                }
            }
        }},
        { "$sort": { "order": 1 } }
    ])
    

    MongoDB를 들어 2.6-3.0

    db.maps.aggregate([
        { "$match": { "points.type": "type1" }},
        { "$project": {
            "points": { 
                "$setDifference": ]
                    { "$map": {
                        "input": "$points",
                        "as": "p",
                        "in": { "$cond": [
                            { "$eq": [ "$$p.type", "$type1" ] },
                            "$$p",
                            false
                        ]}
                    }},
                    [false]   
                ]
            }
        }},
        { "$sort": { "points.distanceToSpawn": 1 } }
    ])
    

    이하 효율적으로 버전에서 MongoDB를 2.6 이전 :

    db.maps.aggregate([
        { "$match": { "points.type": "type1" }},
        { "$unwind": "$points" },
        { "$match": { "points.type": "type1" }},
        { "$group": {
            "_id": "$id",
            "points": { "$push": "$points" }
        }},
        { "$sort": { "points.ditanceToSpawn": 1 } }         
    ])
    

    즉, 올바른 요소와 일치하고는 "일종의"작업에서 고려가 할 수있는 유일한 방법입니다. 기본 커서 정렬은 그렇지 대신 선택 "유형"일치하지 않는 배열 요소의 필드 값을 고려할 것입니다.

  2. from https://stackoverflow.com/questions/28889240/mongodb-sort-documents-by-array-elements by cc-by-sa and MIT license