2017-10-10 5 views
1

나는 이와 같은 컬렉션을 가지고 있습니다. 소수의 사용자 만이이 sortOrder 필드기존 필드 만 정렬

[{ 
    "_id": "59ccf78bde3d14019169c105", 
    "name": "Best FX broker ", 
}, 
{ 
    "_id": "59ccf78bde3d14019169c102", 
    "name": "Best automated Performance tool ", 
    "sortOrder": 1, 
}, 
{ 
    "_id": "59ccf78bde3d14019169c104", 
    "name": "Best Regtech/ reporting solution ", 
}, 
{ 
    "_id": "59ccf78bde3d14019169c106", 
    "name": "NEW: BEST CRYPTO SERVICE PROVIDER", 
    "sortOrder": 2, 
}] 

나는 일종의 sort({"sortOrder": 1})에 의해 나는

[ { 
    "_id": "59ccf78bde3d14019169c102", 
    "name": "Best automated Performance tool ", 
    "sortOrder": 1, 
}, 
{ 
    "_id": "59ccf78bde3d14019169c106", 
    "name": "NEW: BEST CRYPTO SERVICE PROVIDER", 
    "sortOrder": 2, 
}, 
{ 
    "_id": "59ccf78bde3d14019169c105", 
    "name": "Best FX broker ", 
}, 
{ 
    "_id": "59ccf78bde3d14019169c104", 
    "name": "Best Regtech/ reporting solution ", 
}] 
(상단 필드 sortOrder와 값)이

[{ 
    "_id": "59ccf78bde3d14019169c105", 
    "name": "Best FX broker ", 
}, 
{ 
    "_id": "59ccf78bde3d14019169c104", 
    "name": "Best Regtech/ reporting solution ", 
}, 
{ 
    "_id": "59ccf78bde3d14019169c102", 
    "name": "Best automated Performance tool ", 
    "sortOrder": 1, 
}, 
{ 
    "_id": "59ccf78bde3d14019169c106", 
    "name": "NEW: BEST CRYPTO SERVICE PROVIDER", 
    "sortOrder": 2, 
}] 

하지만이 같은 모음을 정렬 할 필요를 얻을 때

이 질문에 답하려면 어떻게해야합니까?

+2

이 지원되지만 몇 가지 해결 방법/다른 방법이 있습니다 아마도 당신이 원하는 것을 얻을 수 있습니다. https://stackoverflow.com/questions/36028267/mongodb-sort-by-only-exists-entry-key-with-value-first-and-key-with-null-or-not 및 https : // stackoverflow를 참조하십시오. .com/questions/32680809/mongodb-sort-by-field-existing-and-then-alphabetically 입력란 –

답변

1

db.collection.aggregate ([{$ project : { "_id": 1, "sortOrder": 1, "name": 1, "sortOrder": { "$ ifNull": [ "$ sortOrder" ""]}}} {$ 정렬 : {있는 sortOrder : 1}}

])

그것은 당신의 정확한 사용 사례처럼 보이지 않는
0

콜백을 사용하여 거의 모든 방식으로 정렬을 처리 할 수 ​​있습니다.

내 용액 (미안) 정나미 비효율적이지만, 작동 :

array.sort(function (a, b) { 
    if (a.sortOrder == undefined && b.sortOrder == undefined) { 
    return 0; 
    } 
    if (a.sortOrder == undefined) { 
    return 1; 
    } 
    if (b.sortOrder == undefined) { 
    return -1; 
    } 
    if (a.sortOrder > b.sortOrder) { 
    return 1; 
    } 
    if (a.sortOrder < b.sortOrder) { 
    return -1; 
    } 

    return 0; 
}); 

A와 B 변수 여기 배열의 요소이고, 여기에서 반환 -1 어레이의 전면에 이동 , 0은 변경되지 않고 1은 배열의 뒤쪽으로 이동합니다.