MongoDB сортировать по полю A, если поле B! = Null, иначе сортировать по полю C - PullRequest
0 голосов
/ 21 февраля 2019

Я сталкиваюсь с этой проблемой:

Извлечение документов, отсортированных по полю A , если поле B существует / не равно нулю . В противном случае сортировка по полю C.

В мире SQL я бы сделал два запроса и создал UNION SELECT, но я не знаю, как начать с Mongo.

Является ли карта / уменьшить правильный путь?Или я должен сосредоточиться на «вычисляемом поле» и использовать это.Я относительно новичок в MongoDB, и я прошу указания.

Редактировать: В соответствии с запросом, вот некоторые примеры данных:

Дано:

|     ID     | FieldA | FieldB | FieldC |
|------------|--------|--------|--------|
| Document 1 |     10 | X      |     40 |
| Document 2 |     20 | <null> |     50 |
| Document 3 |     30 | Z      |     60 |

Ожидаемый результат (порядок) включая колонку с расчетом в качестве комментария

|     ID     | FieldA | FieldB | FieldC | "A" if "B" !=<null> else "C" |
|------------|--------|--------|--------|------------------------------|
| Document 1 |     10 | X      |     40 |                           10 |
| Document 3 |     30 | Z      |     60 |                           30 |
| Document 2 |     20 | <null> |     50 |                           50 |

Спасибо, schube

1 Ответ

0 голосов
/ 21 февраля 2019

Учитывая следующие документы:

{ "a": 10, "b": "X",  "c" : 40 }
{ "a": 20, "b": null, "c" : 50 }
{ "a": 30, "b": "Z",  "c" : 60 }

Один из способов сделать это был бы так:

db.collection.aggregate({
    $addFields: {
        "sortField": { // create a new field called "sortField"
            $cond: { // and assign a value that depends on
                if: { $ne: [ "$b", null ] }, // whether "b" is not null
                then: "$a", // in which case our field shall hold the value of "a"
                else: "$c" // or else it shall hold the value of "c"
            }
        }
    }
}, {
    $sort: {
        "sortField": 1 // sort by our computed field
    }
}, {
    $project: {
        "sortField": 0 // remove "sort" field if needed
    }
})

Если у вас был документ без a b поле, как в:

{ "a": 20, "c" : 50 }

, тогда вам нужно будет применить один из методов, упомянутых здесь .

Итак, ваша if часть внутри *Например, 1018 * может выглядеть так:

if: { $ne: [ "$b", undefined ] }, // whether "b" is null or doesn't exist at all
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...