Mongo Aggregation $ group theo _id và ngày
Aug 29 2020
Tôi có một truy vấn tổng hợp mongo hiện đang nhóm các kết quả dựa trên id vị trí và sử dụng $push to return a count value using $kích thước của các phần tử trong một mảng cho các tài liệu kết quả khớp với một ngày nhất định. Tôi cần điều chỉnh kết quả đầu ra cho từng kết quả được nhóm theo id vị trí và $ tổng các giá trị đếm được nhóm theo ngày. Ví dụ bên dưới.
Kết quả đầu ra hiện tại giống như sau:
[{
"_id" : "100",
"appts" : [
{
"count" : NumberInt(2),
"date" : "2020-08-07"
},
{
"count" : NumberInt(2),
"date" : "2020-08-07"
} ]
},
{
"_id" : "103",
"appts" : [
{
"count" : NumberInt(1),
"date" : "2020-08-07"
},
{
"count" : NumberInt(3),
"date" : "2020-08-07"
},
{
"count" : NumberInt(2),
"date" : "2020-08-08"
} ]
}]
Tôi đang cố gắng tạo ra kết quả sau:
[{
"_id" : "100",
"appts" : [
{
"count" : NumberInt(4),
"date" : "2020-08-07"
} ]
},
{
"_id" : "103",
"appts" : [
{
"count" : NumberInt(4),
"date" : "2020-08-07"
},
{
"count" : NumberInt(2),
"date" : "2020-08-08"
} ]
}]
Truy vấn hiện tại của tôi:
[
{ $match: { ... } },
{
$group: { _id: { date: { $dateToString: { format: '%Y-%m-%d', date: '$time' } }, loc: '$location.branchId',
additionalReminders: '$analytics.twilio.additionalReminders' } } }, { $group: {
_id: '$_id.loc', appts: { $push: {
count: { $size: '$_id.additionalReminders' },
date: '$_id.date'
}
}
}
}
]
Giải pháp: Thêm truy vấn sau do @ Rfroes87 cung cấp vào cuối đường dẫn đã giải quyết được sự cố.
{ $unwind: "$appts" }, { $group: {
_id: { "id": "$_id", "date": "$appts.date" },
"count": { $sum: "$appts.count" }
}
},
{
$group: { _id: "$_id.id",
"appts": { $push: { "count": "$count", "date": "$_id.date" } }
}
}
Trả lời
3 turivishal Aug 29 2020 at 01:01
Có lẽ bạn có thể thử, không chắc với cấu trúc tài liệu của mình,
Cấu trúc tài liệu dự đoán:
[{"time":ISODate("1970-01-01T00:00:00Z"),"location":{branchId:1},analytics:{twilio:{additionalReminders:[1,2,3]}}},{"time":ISODate("1970-01-01T00:00:00Z"),"location":{branchId:1},analytics:{twilio:{additionalReminders:[1,2]}}},{"time":ISODate("1970-01-02T00:00:00Z"),"location":{branchId:1},analytics:{twilio:{additionalReminders:[1,2,3]}}},]
db.collection.aggregate([
{
$group: { _id: { date: { $dateToString: { format: "%Y-%m-%d", date: "$time" } }, loc: "$location.branchId"
},
// get size of array and sum here
additionalReminders: {
$sum: { $size: "$analytics.twilio.additionalReminders" } } } }, { $group: {
_id: "$_id.loc", appts: { $push: {
// add just field here
count: "$additionalReminders", date: "$_id.date"
}
}
}
}
])
Sân chơi
2 varman Aug 29 2020 at 00:54
Bạn có thể thử làm theo
db.collection.aggregate([
{
$unwind: "$appts"
},
{
$group: { _id: { "_id": "$_id",
"date": "$appts.date" }, "count": { $sum: "$appts.count" } } }, { $group: {
_id: "$_id._id", "appts": { "$addToSet": {
"count": "$count", "date": "$_id.date"
}
}
}
}
])
Sân chơi Working Mongo