Как отфильтровать результат поиска - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть запрос, который я использую $ lookup , и внутри этого запроса мне нужно передать параметр для «фильтрации» результатов, основанных на поле scheduleStart (я использовал момент .js чтобы передать даты моим запросам).Я не знаю, куда мне передать параметры.

Мой запрос

   User.aggregate([{
          $match: {
            storeKey: req.body.store,     
          }
        },
        {
          $group: {
            _id: {
              id: "$_id",
              name: "$name",
              cpf: "$cpf",      
              phone: "$phone",
              email: "$email",
              birthday: "$birthday",
              lastName: "$lastname"      
            },
            totalServices: {
              $sum: "$services"
            },    
          }
        },
        {
          $lookup: {
            from: "schedules",
            "let": { "id": "$_id.phone" },
            "pipeline": [
               { "$match": { "$expr": { "$eq": ["$customer.phone", "$$id"] }}},
               { "$project": { "scheduleStart": 1, "scheduleEnd": 1, "value": 1 }}
            ],
            "as": "user_detail"
          }  
        },  
        {
          $project: {
            _id: 1,
            name: 1,
            name: 1,
            cpf: 1,      
            phone: 1,
            email: 1,
            birthday: 1,
            totalServices: 1,
            totalValue: { $sum : "$user_detail.value" },      
            count: {
              $sum: 1
            },
            user_detail: 1
          }
        },

Параметры, которые я хочу передать в этом запросе:

 start = '2018-12-13 00:00'
 period = '2017-01-13 00:00'

Фактический результат моего запроса:

6:
count: 1
totalServices: 0
totalValue: 73
user_detail: Array(2)
0: {_id: "5bb2832890c4f23d207b5d71", scheduleStart: "2018-10-02 08:20", scheduleEnd: "2018-10-02 08:40", value: 40}
1: {_id: "5bfd9c13e1193a4f30df05e4", scheduleStart: "2018-11-27 00:03", scheduleEnd: "2018-11-27 00:13", value: 33}

_id: {id: "5bfed8bd70de7a383855f09e", name: "Chris Santos G", phone: "11969109995", email: "csantosgrossi@gmail.com", birthday: "1992-03-06"}

Как передать параметр для фильтрации по scheduleStart результатам?Я не знаю, нужно ли мне проходить внутри $ lookup или после.

1 Ответ

0 голосов
/ 13 декабря 2018

Вы можете использовать фильтр внутри $lookup внутри конвейера $match, используя $lte и $gte операторы запросов

{ "$lookup": {
  "from": "schedules",
  "let": { "id": "$_id.phone" },
  "pipeline": [
    { "$match": {
      "$expr": { "$eq": ["$customer.phone", "$$id"] },
      "scheduleStart": {
        "$lte": moment("2018-12-13 00:00").toDate(),
        "$gte": moment("2017-01-13 00:00").toDate()
      }
    }},
    { "$project": { "scheduleStart": 1, "scheduleEnd": 1, "value": 1 }}
  ],
  "as": "user_detail"
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...