@Qvini

Как в MongoDB при сортировке понизить приоритет пустых полей?

День добрый. У меня возникла проблема с сортировкой. Мне нужно отсортировать по полям f0, f1, f2, но при этом не учитывать регистр символа, а записи у которых нету поля поместить в конец списка.

Вот тестовы данные
db.getCollection("test").insert({f0: "A", f1: "A", f2: "A"});
db.getCollection("test").insert({f0: "A", f1: "A", f2: "a"});
db.getCollection("test").insert({f0: "A", f1: "A", f2: "B"});
db.getCollection("test").insert({f0: "A", f1: "A", f2: "b"});
db.getCollection("test").insert({f0: "A", f1: "A"});
db.getCollection("test").insert({f0: "A", f1: "a", f2: "A"});
db.getCollection("test").insert({f0: "A", f1: "a", f2: "a"});
db.getCollection("test").insert({f0: "A", f1: "a", f2: "B"});
db.getCollection("test").insert({f0: "A", f1: "a", f2: "b"});
db.getCollection("test").insert({f0: "A", f1: "a"});
db.getCollection("test").insert({f0: "A", f1: "B", f2: "A"});
db.getCollection("test").insert({f0: "A", f1: "B", f2: "a"});
db.getCollection("test").insert({f0: "A", f1: "B", f2: "B"});
db.getCollection("test").insert({f0: "A", f1: "B", f2: "b"});
db.getCollection("test").insert({f0: "A", f1: "B"});
db.getCollection("test").insert({f0: "A", f1: "b", f2: "A"});
db.getCollection("test").insert({f0: "A", f1: "b", f2: "a"});
db.getCollection("test").insert({f0: "A", f1: "b", f2: "B"});
db.getCollection("test").insert({f0: "A", f1: "b", f2: "b"});
db.getCollection("test").insert({f0: "A", f1: "b"});
db.getCollection("test").insert({f0: "A"});
db.getCollection("test").insert({f0: "a", f1: "A", f2: "A"});
db.getCollection("test").insert({f0: "a", f1: "A", f2: "a"});
db.getCollection("test").insert({f0: "a", f1: "A", f2: "B"});
db.getCollection("test").insert({f0: "a", f1: "A", f2: "b"});
db.getCollection("test").insert({f0: "a", f1: "A"});
db.getCollection("test").insert({f0: "a", f1: "a", f2: "A"});
db.getCollection("test").insert({f0: "a", f1: "a", f2: "a"});
db.getCollection("test").insert({f0: "a", f1: "a", f2: "B"});
db.getCollection("test").insert({f0: "a", f1: "a", f2: "b"});
db.getCollection("test").insert({f0: "a", f1: "a"});
db.getCollection("test").insert({f0: "a", f1: "B", f2: "A"});
db.getCollection("test").insert({f0: "a", f1: "B", f2: "a"});
db.getCollection("test").insert({f0: "a", f1: "B", f2: "B"});
db.getCollection("test").insert({f0: "a", f1: "B", f2: "b"});
db.getCollection("test").insert({f0: "a", f1: "B"});
db.getCollection("test").insert({f0: "a", f1: "b", f2: "A"});
db.getCollection("test").insert({f0: "a", f1: "b", f2: "a"});
db.getCollection("test").insert({f0: "a", f1: "b", f2: "B"});
db.getCollection("test").insert({f0: "a", f1: "b", f2: "b"});
db.getCollection("test").insert({f0: "a", f1: "b"});
db.getCollection("test").insert({f0: "a"});
db.getCollection("test").insert({f0: "B", f1: "A", f2: "A"});
db.getCollection("test").insert({f0: "B", f1: "A", f2: "a"});
db.getCollection("test").insert({f0: "B", f1: "A", f2: "B"});
db.getCollection("test").insert({f0: "B", f1: "A", f2: "b"});
db.getCollection("test").insert({f0: "B", f1: "A"});
db.getCollection("test").insert({f0: "B", f1: "a", f2: "A"});
db.getCollection("test").insert({f0: "B", f1: "a", f2: "a"});
db.getCollection("test").insert({f0: "B", f1: "a", f2: "B"});
db.getCollection("test").insert({f0: "B", f1: "a", f2: "b"});
db.getCollection("test").insert({f0: "B", f1: "a"});
db.getCollection("test").insert({f0: "B", f1: "B", f2: "A"});
db.getCollection("test").insert({f0: "B", f1: "B", f2: "a"});
db.getCollection("test").insert({f0: "B", f1: "B", f2: "B"});
db.getCollection("test").insert({f0: "B", f1: "B", f2: "b"});
db.getCollection("test").insert({f0: "B", f1: "B"});
db.getCollection("test").insert({f0: "B", f1: "b", f2: "A"});
db.getCollection("test").insert({f0: "B", f1: "b", f2: "a"});
db.getCollection("test").insert({f0: "B", f1: "b", f2: "B"});
db.getCollection("test").insert({f0: "B", f1: "b", f2: "b"});
db.getCollection("test").insert({f0: "B", f1: "b"});
db.getCollection("test").insert({f0: "B"});
db.getCollection("test").insert({f0: "b", f1: "A", f2: "A"});
db.getCollection("test").insert({f0: "b", f1: "A", f2: "a"});
db.getCollection("test").insert({f0: "b", f1: "A", f2: "B"});
db.getCollection("test").insert({f0: "b", f1: "A", f2: "b"});
db.getCollection("test").insert({f0: "b", f1: "A"});
db.getCollection("test").insert({f0: "b", f1: "a", f2: "A"});
db.getCollection("test").insert({f0: "b", f1: "a", f2: "a"});
db.getCollection("test").insert({f0: "b", f1: "a", f2: "B"});
db.getCollection("test").insert({f0: "b", f1: "a", f2: "b"});
db.getCollection("test").insert({f0: "b", f1: "a"});
db.getCollection("test").insert({f0: "b", f1: "B", f2: "A"});
db.getCollection("test").insert({f0: "b", f1: "B", f2: "a"});
db.getCollection("test").insert({f0: "b", f1: "B", f2: "B"});
db.getCollection("test").insert({f0: "b", f1: "B", f2: "b"});
db.getCollection("test").insert({f0: "b", f1: "B"});
db.getCollection("test").insert({f0: "b", f1: "b", f2: "A"});
db.getCollection("test").insert({f0: "b", f1: "b", f2: "a"});
db.getCollection("test").insert({f0: "b", f1: "b", f2: "B"});
db.getCollection("test").insert({f0: "b", f1: "b", f2: "b"});
db.getCollection("test").insert({f0: "b", f1: "b"});
db.getCollection("test").insert({f0: "b"});
db.getCollection("test").insert({ f1: "A", f2: "A"});
db.getCollection("test").insert({ f1: "A", f2: "a"});
db.getCollection("test").insert({ f1: "A", f2: "B"});
db.getCollection("test").insert({ f1: "A", f2: "b"});
db.getCollection("test").insert({ f1: "A"});
db.getCollection("test").insert({ f1: "a", f2: "A"});
db.getCollection("test").insert({ f1: "a", f2: "a"});
db.getCollection("test").insert({ f1: "a", f2: "B"});
db.getCollection("test").insert({ f1: "a", f2: "b"});
db.getCollection("test").insert({ f1: "a"});
db.getCollection("test").insert({ f1: "B", f2: "A"});
db.getCollection("test").insert({ f1: "B", f2: "a"});
db.getCollection("test").insert({ f1: "B", f2: "B"});
db.getCollection("test").insert({ f1: "B", f2: "b"});
db.getCollection("test").insert({ f1: "B"});
db.getCollection("test").insert({ f1: "b", f2: "A"});
db.getCollection("test").insert({ f1: "b", f2: "a"});
db.getCollection("test").insert({ f1: "b", f2: "B"});
db.getCollection("test").insert({ f1: "b", f2: "b"});
db.getCollection("test").insert({ f1: "b"});
db.getCollection("test").insert({});


Вот сам запрос.
db.getCollection('test').find({}).sort({"f0": 1,"f1": 1,"f2": 1});


А вот вывод, и в нем видно, что пустые значения он вытаскивает на верх, потом идут заглавные буквы, а потом маленькие. Мне нужно, сначала буква "a|A", "b|B" и уже потом пустые значения.

/* 1 */
{
    "_id" : ObjectId("564d88d97b9999b45267d737")
}

/* 2 */
{
    "_id" : ObjectId("564d88d97b9999b45267d727"),
    "f1" : "A"
}

/* 3 */
{
    "_id" : ObjectId("564d88d97b9999b45267d723"),
    "f1" : "A",
    "f2" : "A"
}

/* 4 */
{
    "_id" : ObjectId("564d88d97b9999b45267d725"),
    "f1" : "A",
    "f2" : "B"
}

/* 5 */
{
    "_id" : ObjectId("564d88d97b9999b45267d724"),
    "f1" : "A",
    "f2" : "a"
}

/* 6 */
{
    "_id" : ObjectId("564d88d97b9999b45267d726"),
    "f1" : "A",
    "f2" : "b"
}

/* 7 */
{
    "_id" : ObjectId("564d88d97b9999b45267d731"),
    "f1" : "B"
}

/* 8 */
{
    "_id" : ObjectId("564d88d97b9999b45267d72d"),
    "f1" : "B",
    "f2" : "A"
}

/* 9 */
{
    "_id" : ObjectId("564d88d97b9999b45267d72f"),
    "f1" : "B",
    "f2" : "B"
}

/* 10 */
{
    "_id" : ObjectId("564d88d97b9999b45267d72e"),
    "f1" : "B",
    "f2" : "a"
}

/* 11 */
{
    "_id" : ObjectId("564d88d97b9999b45267d730"),
    "f1" : "B",
    "f2" : "b"
}

/* 12 */
{
    "_id" : ObjectId("564d88d97b9999b45267d72c"),
    "f1" : "a"
}

/* 13 */
{
    "_id" : ObjectId("564d88d97b9999b45267d728"),
    "f1" : "a",
    "f2" : "A"
}

/* 14 */
{
    "_id" : ObjectId("564d88d97b9999b45267d72a"),
    "f1" : "a",
    "f2" : "B"
}

/* 15 */
{
    "_id" : ObjectId("564d88d97b9999b45267d729"),
    "f1" : "a",
    "f2" : "a"
}

/* 16 */
{
    "_id" : ObjectId("564d88d97b9999b45267d72b"),
    "f1" : "a",
    "f2" : "b"
}

/* 17 */
{
    "_id" : ObjectId("564d88d97b9999b45267d736"),
    "f1" : "b"
}

/* 18 */
{
    "_id" : ObjectId("564d88d97b9999b45267d732"),
    "f1" : "b",
    "f2" : "A"
}

/* 19 */
{
    "_id" : ObjectId("564d88d97b9999b45267d734"),
    "f1" : "b",
    "f2" : "B"
}

/* 20 */
{
    "_id" : ObjectId("564d88d97b9999b45267d733"),
    "f1" : "b",
    "f2" : "a"
}

/* 21 */
{
    "_id" : ObjectId("564d88d97b9999b45267d735"),
    "f1" : "b",
    "f2" : "b"
}

/* 22 */
{
    "_id" : ObjectId("564d88d97b9999b45267d6e3"),
    "f0" : "A"
}

/* 23 */
{
    "_id" : ObjectId("564d88d97b9999b45267d6d3"),
    "f0" : "A",
    "f1" : "A"
}

/* 24 */
{
    "_id" : ObjectId("564d88d97b9999b45267d6cf"),
    "f0" : "A",
    "f1" : "A",
    "f2" : "A"
}

/* 25 */
{
    "_id" : ObjectId("564d88d97b9999b45267d6d1"),
    "f0" : "A",
    "f1" : "A",
    "f2" : "B"
}

/* 26 */
{
    "_id" : ObjectId("564d88d97b9999b45267d6d0"),
    "f0" : "A",
    "f1" : "A",
    "f2" : "a"
}

/* 27 */
{
    "_id" : ObjectId("564d88d97b9999b45267d6d2"),
    "f0" : "A",
    "f1" : "A",
    "f2" : "b"
}

/* 28 */
{
    "_id" : ObjectId("564d88d97b9999b45267d6dd"),
    "f0" : "A",
    "f1" : "B"
}

/* 29 */
{
    "_id" : ObjectId("564d88d97b9999b45267d6d9"),
    "f0" : "A",
    "f1" : "B",
    "f2" : "A"
}

/* 30 */
{
    "_id" : ObjectId("564d88d97b9999b45267d6db"),
    "f0" : "A",
    "f1" : "B",
    "f2" : "B"
}

/* 31 */
{
    "_id" : ObjectId("564d88d97b9999b45267d6da"),
    "f0" : "A",
    "f1" : "B",
    "f2" : "a"
}

/* 32 */
{
    "_id" : ObjectId("564d88d97b9999b45267d6dc"),
    "f0" : "A",
    "f1" : "B",
    "f2" : "b"
}

/* 33 */
{
    "_id" : ObjectId("564d88d97b9999b45267d6d8"),
    "f0" : "A",
    "f1" : "a"
}


Спасибо
  • Вопрос задан
  • 258 просмотров
Пригласить эксперта
Ответы на вопрос 1
@lega
Сделайте отдельное поле под индекс, например:
{f0: "A", f1: "a", f2: "B"} -> _index: "aab"
{ f1: "A", f2: "b"} -> _index: "xab"
"x" вместо пропущенного поля, что-б уходило в конец сортировки
Если нужна уникальность, то этот "ключ" можно писать в поле _id.

В итоге будет работать быстрее и памяти потреблять меньше.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы