UBOS Community

vova
vova

Posted on • Updated on

Creation flows on the example $match operation

{ $match: { <query> } }
Це основний синтаксис для $match. Його можна використовувати кілька разів. І практично кожен етап можна використовувати після нього, за деякими винятками, які ми розглянемо пізніше.

Варто думати про $match як про фільтр, а не як пошук.

Ми налаштовуємо фільтри на етапі $match, і в міру надходження документів лише ті, які відповідають критеріям, передаються далі в конвеєр.
На зображенні для прикладу $match пропускає лише кола та зірки.
Image description
Ми можемо виконувати matches на основі порівняння, логіки, масивів і багато іншого. Єдине обмеження полягає в тому, що ми не можемо використовувати оператор $where. І якщо ми хочемо використовувати оператор $text, етап $match має бути першим етапом конвеєра. Якщо $match є першим етапом, він може використовувати переваги індексів, які збільшують швидкість наших запитів. Знову ж таки, $match має з’явитися на початку наших конвеєрів.

Приклади

Створим флов який повертає інформацію про користувача за його ідентифікатором.
Флов складається з декількох вузлів:

  • http in
  • function
  • mongodb in (тут буде посилання на статтю про підключення mongodb)
  • http response
  • debug Image description

Вузол http in містить у собі властивості:

  • Method
  • URL
  • Name Image description У URL ми передали змінну шляху /:id куди ми будем передавати ідентифікатор користувача. У вузлі function формуєм запит до бази даних. Image description

msg.collection = "users"; - це назва колекції
У msg.payload записуєм поетапно конвеєри.
Першим етапом є фільтрація колекції по _id.

Для пошуку за індексом потрібно використати модуль ObjectId

Для того щоб його добавити потрібно перейти в налаштування вузла function та натиснути кнопку add і вибрати відповідний модуль.
Image description
Передаєм у ObjectId ідентифікатор користувача.

    {
        $match: {
            _id: ObjectId(msg.req.params.id)
        }
    }
Enter fullscreen mode Exit fullscreen mode

У msg.req.params зберігаються всі змінні які ми передаєм через параметри шляху. Щоб побачити об'єкт req потрібно з'єднати два вузли http in та debug.
Image description
Наступним етапом конвеєра вказуєм $project який повертає певні поля.

    {
        $project: {
            "firstName": 1,
            "email": 1,
            "city": 1
        }
    }
Enter fullscreen mode Exit fullscreen mode

Якщо добавити вузол debug до function то можна побачити всі етапи конвеєру з даними які прийшли з вузла http in.
Image description

Далі потрібно з'єднати вузол function до mongodb in для того щоб відправити запит у базу даних. Потім добавити вузол http response щоб отримати відповідь від бази.

Давайте зробим запит через Postman передавши /:id та отримаєм відповідь.
Image description


Створим флов який повертає кількість продуктів які не видалені та підходять під певний діапазон ціни.
Image description

msg.collection = "products";

msg.payload = [
    {
        $match: {
            deleted: false,
            price: { $gt: 2000, $lt: 2500 }
        }
    },
    { $group: { _id: null, count: { $sum: 1 } } }
]

return msg;
Enter fullscreen mode Exit fullscreen mode

Результат
Image description

Використані операції

  • $match
  • $project
  • $gt
  • $lt
  • $sum
  • $group

Discussion (0)