Mongoose If в запросе find - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь сделать find(), но с оператором if.

У меня следующий запрос:

Promise.all([

  User.find({ $and: [
    { 'type': 'user' },
    { $or: [
        { username: { $regex: String(value), $options: "i" } },
        { firstName: { $regex: String(value), $options: "i" } },
    ]}
  ]})
  .then(user => user),

  User.countDocuments({ 'type': 'user' })
  .then(count => count)
])
.then(promiseData => {
    return response.status(200).json({ count: promiseData[1] });
}

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

Например, допустим, что пользователь 'admin' выполняет поиск. Я хочу добавить другой запрос в поиск, например:

User.find({ $and: [
    { 'type': 'user' },

    // If the user is an admin => _if(true){ run this }_
    { 'stuff': true },
    // end if

    { $or: [
        { username: { $regex: String(value), $options: "i" } },
        { firstName: { $regex: String(value), $options: "i" } },
    ]}
  ]})
  .then(user => user),

Можно ли добавить еще одно поле в мой запрос с помощью оператора if? Я не хочу запускать 2 запроса, которые по сути одинаковы.

Ответы [ 2 ]

0 голосов
/ 02 июля 2019
let query = { 
    $and: [
        { 'type': 'user' },
        { $or: [
            { username: { $regex: String(value), $options: "i" } },
            { firstName: { $regex: String(value), $options: "i" } },
        ]}    
    ]
}

/// add your logic
if (req.user.admin) {
    query['$and'].push({ 'stuff': true });
    console.log('req = ', query)
}

/// execute the request
Promise.all([
   User.find(query).then(user => user),
   User.countDocuments({ 'type': 'user' }).then(count => count)
])
.then(promiseData => {
    return response.status(200).json({ count: promiseData[1] });
}
0 голосов
/ 02 июля 2019

Вы должны попробовать group или facet конвейер агрегации для решения такой задачи.

db.users.aggregate([
    {
        $facet:{
            users: [
                {
                    $match: {
                        eUserType: 'user',
                        // query related users
                    }
                }
            ],
            admins:[
                {
                    $match: {
                        eUserType: 'admin',
                         // query related admins
                    }
                }
            ],
        }
    },
    {
        // chnage format as per your need.
    }
])

и только после этого вы получите результаты, которые вы объединяете или объединяете данные в соответствии с вашими потребностями.

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