Как я могу получить максимальную дату и ее общее значение за каждую неделю в MongoDB? - PullRequest
0 голосов
/ 11 марта 2020

Я использую оболочку MongoDB для выполнения запроса в следующем запросе.

db.analytics.aggregate(
    [{ "$match": { "community": ObjectId("5e1ad5b6910a72a9bd02ccc8") } },
    {
        "$project": {
            "_id": 1, "date": 1, "week": { "$week": "$date" },
            "total": { "$add": ["$data.postCount", "$data.commentCount", "$data.voteCount.totalVotes", "$data.likeCount"] }
        }
    }]) 

Теперь я получаю его, как показано на рисунке ниже.

Enter image description here

На приведенном выше рисунке я преобразовал дату в номер недели, но теперь мне нужна только максимальная общая дата каждой недели. Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Я использую это решение, оно работает нормально.

db.analytics.aggregate({"$match":{"community":ObjectId("5e1ad5b6910a72a9bd02ccc8")}}, 
{"$sort":{"date":1}},
{"$project":{"_id":1, "date": 1, "week":{"$week":"$date"},
"total":{"$add":["$data.postCount", "$data.commentCount", "$data.voteCount.totalVotes", 
"$data.likeCount"]}}},
{"$group":{"_id":"$week","maxdate":{"$last":"$date"},"total":{"$last":"$total"}}},
{"$project":{"_id":"$_id","maxdate":1, "total":1}})
0 голосов
/ 11 марта 2020

Вы можете добавить эти этапы в конвейер агрегации:

/** group on week & push max date to date field, plus push objects 0f {date, Total} to data field */
{
  $group: {
    _id: "$week",
    date: {
      "$max": "$date"
    },
    data: {
      $push: {
        date: "$date",
        Total: "$Total"
      }
    }
  }
},
/** Transform to needed fields & remove unnecessary fields,
 * Add a new Total field which will iterate on data array & get the object where data of that object
 *  matches with data field & use '$arrayElemAt' to get first object out of filtered array(anyway there will be only one object in array though)
 * So use '$let' to get total value out of object retrieved from '$arrayElemAt'
 */
{
  $project: {
    _id: 0,
    week: "$_id",
    date: 1,
    Total: {
      $let: {
        vars: {
          total: {
            $arrayElemAt: [
              {
                $filter: {
                  input: "$data",
                  cond: {
                    $eq: [
                      "$$this.date",
                      "$date"
                    ]
                  }
                }
              },
              0
            ]
          }
        },
        in: "$$total.Total"
      }
    }
  }
}

Тест: MongoDB-Playground

...