MongoDB: сортировать, но с конкретным документом первым в результатах? - PullRequest
0 голосов
/ 23 января 2019

Требование, установленное MGMT и продажами, конечно, заключается в том, что результаты запроса должны содержать конкретный документ в качестве первого результата, а затем все другие документы, соответствующие запросу.

Вот очень упрощенный пример моегоdata:

{ _id: 1,
title: 'other item',
category: 'show'
}
{ _id: 2,
title: 'THE ITEM THAT MUST BE RETURNED FIRST',
category: 'show'
}
{ _id: 3,
title: 'other item 2',
category: 'show'
}
{ _id: 4,
title: 'item not matching query',
category: 'hide'
}

Мне передано значение id, { _id : 2 } в этом примере в теле запроса http, и мне нужно запросить все остальные документы, соответствующие некоторым критериям, { category: 'show' } в этом примере, но статья с id == 2 должна быть первым возвращенным документом:

//pseudo-code. I know this is not even close
itemsCollection.aggregate([
{ $match : { category: 'show'} }
// sort, but with item with id == 2 at top, and the rest sorted by title ASC
{ $sort : { {item_with_id_2: first_returned }, {title: 1} }
])

Выше приведен псевдокод, для которого нужно, чтобы результат выглядел следующим образом:

{ _id: 2,
title: 'THE ITEM THAT MUST BE RETURNED FIRST',
category: 'show'
}
{ _id: 1,
title: 'other item',
category: 'show'
}
{ _id: 3,
title: 'other item 2',
category: 'show'
}

Как заставить один конкретный документ, чей id у меня есть, в верхней части результатов запроса?

1 Ответ

0 голосов
/ 23 января 2019

Вы можете попробовать следующее:

itemsCollection.aggregate([
  {
    "$project": {
      "_id": 1,
      "category": 1,
      "title": 1,
      "priority": {
        "$eq": [
          "$_id",
          2
        ]
      }
    }
  },
  {
    "$sort": {
      "priority": -1
    }
  }
])

По сути, мы создаем синтетический атрибут priority, который устанавливается на true, когда _id соответствует. Наконец, мы сортируем по priority, чтобы вернуть совпадения - документы, которые совпадают по _id, будут сверху, а затем остальные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...