Как мы объединяем два запроса в MongoDB $ in и $ nin с одним и тем же условием?

Я хочу объединить результат $in запроса с $nin запросом и хочу получить окончательный результат. Итак, как мы можем сделать это с помощью одного монго-запроса? есть ли способ сделать это? Например, у меня в коллекции пользователей есть следующие документы:

[{
    name:"test",
    "uid":123
},{
    name:"test1",
    "uid":124
},{
    name:"test2",
    "uid":125
},{
    name:"test3",
    "uid":126
},{
    name:"test3",
    "uid":127
}]

и мне нужен такой результат:

[{
    name:"test2",
    "uid":125
},{
    name:"test3",
    "uid":126
},{
    name:"test",
    "uid":123
},{
    name:"test3",
    "uid":127
}]

В основном я хочу, чтобы uid:125 и uid:126 на первых двух позициях игнорировали их последовательность, а затем uid:123 и uid: 127 на 3-й и 4-й позициях игнорировали их последовательность. Итак, я делаю это, следуя двум запросам

  1. db.getCollection('user').find({uid:{$in:[125,126]}})

  2. db.getCollection('user').find({uid:{$nin:[125,126]}})

а затем я комбинирую результат, но как я могу сделать это в том же запросе? У меня так много документов, что это просто пример, поэтому нужно объединить результат запроса $ in и $ nin

Как я могу это сделать?


person Suraj Dalvi    schedule 07.01.2021    source источник
comment
Можете ли вы предоставить более подробную информацию, текущий результат, ожидаемый результат, а также реализацию вашего запроса и образец документа.   -  person turivishal    schedule 07.01.2021
comment
@turivishal обновил вопрос, не могли бы вы помочь решить эту проблему   -  person Suraj Dalvi    schedule 07.01.2021


Ответы (1)


Прямого способа сделать это нет, я недавно ответил здесь, почти на аналогичный вопрос,

  • Вам нужно использовать агрегационный запрос, попробуйте $cond проверит, uid в массиве [125, 126], а затем вернет 1, иначе 0 в matchResult,
  • $sort на matchResult в порядке убывания
db.getCollection('user').aggregate([
  {
    $addFields: {
      matchResult: {
        $cond: [{ $in: ["$uid", [125, 126]] }, 1, 0]
      }
    }
  },
  { $sort: { matchResult: -1 } }
])

Детская площадка

person turivishal    schedule 07.01.2021