Как сгруппировать записи по дням, используя отметку времени в качестве поля в mongodb и nodejs - PullRequest
1 голос
/ 03 апреля 2019

Я бы хотел сгруппировать записи по дням за определенный период. Я пытался до сих пор, используя этот код, добавленный в агрегатную функцию:

 {
    $group : {
         _id : {  day: { $dayOfMonth: "$timestamp" }},
         count: { $sum: 1 }
      }
 }

А вот так выглядит документ:

{
"_id" : ObjectId("ec9cddd50e08a84cd3f4cccb"),
"orgid" : "5c48500d84430a3a4b828e85",
"timestamp" : ISODate("2019-03-28T14:00:00.000Z"),
"apiid" : {
    "zxczxczxczxczxc" : {
        "errortotal" : 6,
        "hits" : 6,
        "humanidentifier" : "Feedback",
        "identifier" : "663cfc345e42401c6443cfd635301f8f",
        "lasttime" : ISODate("2019-03-28T14:58:07.355Z"),
        "success" : 0,
        "totalrequesttime" : 0.0,
        "requesttime" : 0.0
    }
},
"apikeys" : {
    "00000000" : {
        "errortotal" : 3,
        "hits" : 3,
        "humanidentifier" : "",
        "identifier" : "00000000",
        "lasttime" : ISODate("2019-03-28T14:55:10.438Z"),
        "success" : 0,
        "totalrequesttime" : 0.0,
        "requesttime" : 0.0
    },
    "cae81afc" : {
        "errortotal" : 3,
        "hits" : 3,
        "humanidentifier" : "EE5RqcXMTqcWEx8nZv3vRATLspK2",
        "identifier" : "cbe81afc",
        "lasttime" : ISODate("2019-03-28T14:58:07.355Z"),
        "success" : 0,
        "totalrequesttime" : 0.0,
        "requesttime" : 0.0
    }
}

Есть идеи, как мне этого добиться?

Результат, который я получаю: [{_id: {day: null}, count: 3}], мне кажется, что это неправильно для меня, поскольку у меня есть два документа с одной датой и другой документ с другой отметкой времени

UPDATE: У меня также есть это внутри совокупной функции:

  // Project things as a key/value array, along with the original doc
                {
                    $project: {
                        array: {$objectToArray: '$apikeys'},
                        doc: '$$ROOT',
                    }
                },

                // Match the docs with a field value of 'x'
                {$match: {'array.v.humanidentifier': {$in: trialCustomerUsers}}},

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

Ответы [ 3 ]

1 голос
/ 03 апреля 2019

Просто накапливайте записи в новом поле с помощью оператора $push

{
    $group : {
         _id : {  day: { $dayOfMonth: "$timestamp" }},
         records: { $push: "$$ROOT" }
      }
 }
0 голосов
/ 03 апреля 2019

Вы $project редактировали весь корневой документ в поле doc, используя $$ROOT.Теперь ваша агрегация должна быть следующей:

db.collection.aggregate([
  { "$project": {
    "array": { "$objectToArray": "$apikeys" },
    "doc": "$$ROOT"
  }},
  { "$match": { "array.v.humanidentifier": { "$in": trialCustomerUsers }}},
  { "$group" : {
    "_id" : { "day": { "$dayOfMonth": "$doc.timestamp" }},
    "count": { "$sum": 1 }
  }}
])
0 голосов
/ 03 апреля 2019

Измените эту строку

_id : {  day: { $dayOfMonth: "$timestamp" }}

на

_id : {  day: { $day: "$timestamp" } }

или вы можете сделать что-то вроде этого

$group : {
   _id : null,
   day: '$timestamp',
   count: { $sum: 1 }
}
...