Как найти данные за каждый день недели в пн goose node js - PullRequest
0 голосов
/ 12 июля 2020

Запрос

const weekGraph = await tmUserSubscriptions.aggregate([
            {
                $match:{$and:[{subscriptionId: mongoose.Types.ObjectId(subscriptionId)},
                {createdAt:{$gte:moment().startOf('isoweek').toDate(),
                 $lt:moment().endOf('isoweek').toDate()}}
                ]}
            },
            {"$project":{
                "_id:":1,
                "createdAt":{"$dayOfWeek":"$createdAt"},
                "subscriptionId":1,
                
        }},
        {"$group":{
            "_id":"$createdAt",
            "count":{$sum:1},
        }}
        ])

Результат, я получаю

"data": [
        {
            "_id": 7,
            "count": 1
        },
        {
            "_id": 5,
            "count": 2
        },
        {
            "_id": 6,
            "count": 1
        }
    ]

ожидаемый результат

"data": [
        {
            "_id": 7,
            "count": 1
        },
        {
            "_id": 6,
            "count": 2
        },
        {
            "_id": 5,
            "count": 1
        },
        {
            "_id": 4,
            "count": 0
        },{
            "_id": 3,
            "count": 0
        },{
            "_id": 2,
            "count": 0
        }{
            "_id": 1,
            "count": 0
        }
    ]

Итак, здесь я хочу получать все данные текущей недели день за днем , в моем текущем запросе, если нет данных за любой день недели, он не вернет этот день, но в соответствии с моим ожидаемым результатом мне нужны данные за весь день недели, если нет данных для любого дня недели, он вернет 0, поэтому мне нужны все данные за 7 дней, здесь _id представляет день недели

1 Ответ

1 голос
/ 12 июля 2020

Mongoose / MongoDB вернет агрегат, только если ключ существует. В противном случае он не вернет вам данные (меньше данных для передачи через соединение всегда быстрее). Следовательно, вам нужно будет указать свои собственные значения по умолчанию, если агрегат не имеет данных для вас.

var results = [{ _id: 1, count: 1 }] // assumed from your response

var hasResult = []
for (var result of results) {
  hasResult.push(result._id)
}

for (var i = 1; i <= 7; i++) {
  if (!hasResult.includes(i)) {
    results.push({ _id: i, count: 0 })
  }
}

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