Монго совокупная сумма и групповые позиции по дате - PullRequest
0 голосов
/ 04 июля 2018

Очень спасибо за ваше время. Я работаю над коллекцией, в которой я хочу подвести итог той же даты. Рассмотрим следующий пример, здесь у меня есть два документа, в которых хранятся user_id и Play. Я хочу суммировать те документы, которые имеют ту же дату. В моем случае дата 2017-01-25 имеет два результата, а 2017-01-26 - только один. Пожалуйста, посмотрите на ожидаемый результат.

{
    "_id" : ObjectId("58891b5656a961427e7b23c6"),
    "user_id" : 122,
    "played_event" : [ 
        {
            "date" : ISODate("2017-01-25T21:43:48.146Z"),
            "totalPlayed" : 0,
        }, 
        {
            "date" : ISODate("2017-01-26T22:26:03.273Z"),
            "totalPlayed" : 838,
        }, 
    ]
}

{
    "_id" : ObjectId("58891b5656a961427e7b23f3"),
    "user_id" : 130,
    "played_event" : [ 
        {
            "date" : ISODate("2017-01-25T21:43:48.146Z"),
            "totalPlayed" : 0,
        }, 
        {
            "date" : ISODate("2017-01-30T22:26:03.273Z"),
            "totalPlayed" : 838,
        }, 
    ]
}

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

{
    "result" : [ 
        {
            "date" : "2017-01-25"
            "sum" : 2
        }, 
        {
            "date":"2017-01-26"
            "sum":1
        }, 
    ],
    "ok" : 1
}

Я пытаюсь сделать это с помощью следующего кода

[{"$unwind":"$played_event"},{"$match":{"$and":[{"played_event.date":{"$lte":{"sec":1530766799,"usec":0},"$gte":{"sec":1530162000,"usec":0}}},{"game_id":1}]}},{"$match":{"user_id":{"$nin":[1,2]}}},{"$group":{"_id":"$user_id","total":{"$sum":"$played_event.totalPlayed"},"events":{"$push":"$played_event.date"}}},{"$project":{"_id":0,"user_id":"$_id","total":1,"events":1}}]

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

Ответы [ 3 ]

0 голосов
/ 04 июля 2018
{
    'unwind' : '$played_event'
},
{
    '$group' : {
        _id : { $concat: [ { $year: "$date" }, "+", { $month: "$date" }, "+", { $dayOfMonth: "$date" }] }

        "sum" : { $sum : 1}
    }, 
},
{
    $match : {
        _id : { $in : ["2017-01-25", "2017-01-26"] }
    }
},
{
    $project : { _id : 0, "date" : "$_id", "sum" : 1
}
0 голосов
/ 04 июля 2018

Еще один способ добиться этого. Это мое предпочтительное решение, потому что его легче считать между 2 произвольными датами, а не по дате / месяцу / году

db.test2.aggregate([
        {
            $unwind: {path : "$played_event"}
        },
        {
            $project: { day: { $dateToString: { format: '%Y-%m-%d', date: '$played_event.date' } } }
        },
        {
            $bucket: {
                groupBy: "$day",
                boundaries: [ "2017-01-25","2017-01-26","2017-01-27" ], //bucket is inclusive for start, exclusive for end
                default: "other",
                output: { count: { $sum: 1 } }
            }
        },
    ]
);

Выход:

 { 
    "_id" : "2017-01-25", 
    "count" : 2.0
}
{ 
    "_id" : "2017-01-26", 
    "count" : 1.0
}
{ 
    "_id" : "other", 
    "count" : 1.0
}
0 голосов
/ 04 июля 2018

Сначала необходимо $unwind "played_event", а затем $group, указав желаемый формат для "date", используя $dateToString

db.collection.aggregate([
  { "$unwind": "$played_event" },
  { "$group": {
    "_id": {
      "$dateToString": {
        "format": "%Y-%m-%d",
        "date": "$played_event.date"
      }
    },
    "sum": { "$sum": 1 }
  }},
  { "$project": {
    "date": "$_id",
    "sum": 1,
    "_id": 0
  }}
])

выход

[
  {
    "date": "2017-01-30",
    "sum": 1
  },
  {
    "date": "2017-01-26",
    "sum": 1
  },
  {
    "date": "2017-01-25",
    "sum": 2
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...