Сортировка по двум полям в MongoDB одновременно - PullRequest
0 голосов
/ 19 марта 2019

В настоящее время я разрабатываю решение в MongoDB, где у меня есть две разные схемы данных в одной коллекции. Проблема в том, что некоторые данные имеют разные имена полей. Например: В одном из контрактов дата называется: date_at, а в другом типе контракта она просто называется date.

Итак, вопрос: Как мне отсортировать одно поле, а если его нет в документе, вместо этого сортировать по другому?

В настоящее время я пытаюсь сделать запрос, подобный этому:

db.collection('contracts').aggregate([
  {$project: {
    date_at: [ $ifNull: ['$date', null]
  }},
  {$sort: { date_at: -1 }}
]);

Но, похоже, это не работает. Надеюсь, один из вас сможет мне помочь. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 19 марта 2019

$ ifNull - это ваше решение:

с использованием следующих документов:

[
  {
    _id: 1,
    name: "c"
  },
  {
    _id: 2,
    name: "a"
  },
  {
    _id: 3,
    lastname: "b"
  },
  {
    _id: 4,
    name: "d"
  },
]

В следующем запросе будет указано имя проекта или фамилия, если имя не указано.существовать в качестве имени и сортировать по имени на втором этапе:

db.collection.aggregate([
  {
    $project: {
      name: {
        $ifNull: [
          "$name",
          "$lastname"
        ]
      }
    }
  },
  {
    $sort: {
      name: 1
    }
  }
])

В результате:

[
  {
    "_id": 2,
    "name": "a"
  },
  {
    "_id": 3,
    "name": "b"
  },
  {
    "_id": 1,
    "name": "c"
  },
  {
    "_id": 4,
    "name": "d"
  }
]

$ ifNull принимает массив из 2 параметров: если first равен нулю или нетприсутствует, затем используйте второй.

0 голосов
/ 19 марта 2019

Похоже, вам нужно создать составной индекс .

Составной индекс состоит из одного индекса, который ссылается на несколько полей.

Примечание. Важно, чтобы порядок полей в составном индексе соответствовал логике порядка сортировки вашего запроса (см. Порядок сортировки ).

Пример:

Создать составной индекс:

db.data.createIndex( { a:1, b: 1, c: 1, d: 1 } )

Найти данные с сортировкой:

db.data.find().sort( { a: -1, b: -1 } )

Подробнее:

https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/#sort-on-multiple-fields

https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/

...