Запрос Mon goose с приоритетными условиями запроса - PullRequest
1 голос
/ 09 января 2020

Мне нужно найти все документы, в которых совпадает первый аргумент запроса, затем, если он не может найти больше документов, соответствующих этому запросу, он должен применить другой аргумент запроса.

, например, так:

db.users.find({
 $or: [
   { type: typeToSearch },  // First find all users that has type=typeToSearch
   { active: true } // then if it can't find more users with type=typeToSearch then look for active one
]})
.limit(20)

Что фактически делает этот запрос, он сначала находит активных пользователей (в зависимости от порядка в коллекции). Что мне нужно, так это то, что если у меня есть 18 пользователей с данным типом, они должны быть возвращены сначала, а затем 2 - любые активные.

1 Ответ

1 голос
/ 09 января 2020

Это классная функция, которую вы ищете! Ничто в понедельник goose не поможет вам с этим из коробки, и выискивать в npm Я тоже не вижу ничего, что помогло бы вам там.

Для ваших двух запросов вы должны сделать что-то вроде этого:

const  fancyQuery = async  limit => {
    const first = await db.users.find({ type: typeToSearch }).limit(20)
    let second = [];
    if (first.length < limit)
        second = await  db.users.find({ active: true,
        type:{$ne:typeToSearch}} })
       .limit(20-first.length)
    return [...first, ...second]
}

Единственный другой путь, который я могу придумать, используя api запроса, - это выбрать 40 элементов и затем отфильтровать результаты с помощью javascript. Я думаю, что вам нужно немного изменить запрос, чтобы активная часть запроса не перезапускала все те же документы, что и запрос типа:

db.users.find({
    $or: [
        { type: typeToSearch },
        { active: true,
          type: {$ne: typeToSearch}
        }
    ]})
    .limit(40) 

Сначала вы отфильтруете результаты по типу, а затем по не типу и активному до 20 элементов.

Возможно, вы также сможете использовать конвейер агрегации для выполнения sh, но у меня нет такого ответа у меня под рукой Вибронаконечники.

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