mongoose Date de comparaison sans temps et Group by createdAt et staffId avec Total hebdomadaire, mensuel et annuel du nombre d'employés par agrégation?
Dec 14 2020
Peut-être question est-il sembler en double, mais excuse-toi pour cela.
Je souhaite agréger la base de résultat hebdomadaire, mensuelle et annuelle de la createdAt
propriété sans temps et staffId
.
Le modèle est comme ci-dessous:
{
"_id" : ObjectId("5f351f3d9d90b1281c44c5dp"),
"staffId" : 12345,
"category" : "trend",
"page_route" : "http://example.com/rer",
"expireAt" : ISODate("2020-08-13T11:08:45.196Z"),
"createdAt" : ISODate("2020-08-13T11:08:45.199Z"),
"updatedAt" : ISODate("2020-08-13T11:08:45.199Z"),
"__v" : 0
}
{
"_id" : ObjectId("5f351f3d9d90b1281c44c5de"),
"staffId" : 12346,
"category" : "incident",
"page_route" : "http://example.com/rergfhfhf",
"expireAt" : ISODate("2020-08-14T11:08:45.196Z"),
"createdAt" : ISODate("2020-08-08T11:08:45.199Z"),
"updatedAt" : ISODate("2020-08-12T11:08:45.199Z"),
"__v" : 0
}
{
"_id" : ObjectId("5f351f3d9d90b1281c44c5dc"),
"staffId" : 12347,
"category" : "trend",
"page_route" : "http://example.com/rerrwe",
"expireAt" : ISODate("2020-08-13T11:08:45.196Z"),
"createdAt" : ISODate("2020-08-13T11:08:45.199Z"),
"updatedAt" : ISODate("2020-08-13T11:08:45.199Z"),
"__v" : 0
}
{
"_id" : ObjectId("5f351f3d9d90b1281c44c5dr"),
"staffId" : 12348,
"category" : "trend",
"page_route" : "http://example.com/rerrwe",
"expireAt" : ISODate("2020-08-12T11:08:45.196Z"),
"createdAt" : ISODate("2020-08-08T11:08:45.199Z"),
"updatedAt" : ISODate("2020-08-12T11:08:45.199Z"),
"__v" : 0
}
Résultat attendu: Exemple 1) Hebdomadaire
[
{_id: "2020-11-13", total: 2},
{_id: "2020-11-8", total: 2},
]
Exemple 2) Mensuel
[
{_id: "2020-11-8", total: 4},
]
de même pour chaque année ...
J'utilise nodejs et mangouste pour implémenter l' API .
Je lutte beaucoup mais je n'arrive pas à atteindre le résultat escompté.
si quelqu'un m'aide, ce sera d'une grande aide.
Merci à tous les experts.
J'ai essayé quelque chose comme ça:
[
{
$match: { createdAt: { $gte: new Date(currentDate), $lt: new Date(nextDate) } } }, { $project: {
_id: 1,
staffId: 1,
day: {
$dayOfMonth: "$createdAt"
},
month: {
$month: "$createdAt"
},
year: {
$year: "$createdAt"
}
}
},
{
$project: { _id: 1, staffId: 1, datetime: { $concat: [
{
$substr: ["$year", 0, 4]
},
"-",
{
$substr: ["$month", 0, 2]
},
"-",
{
$substr: ["$day", 0, 2]
}
]
}
}
},
{
$group: { _id: { createdAt: "$datetime",
staffId: "$staffId" } } }, { $group: {
_id: {$week:"$_id.createdAt"},
total: {
$sum: 1 } } }, { $sort: { _id: 1 } }
];
Réponses
3 turivishal Dec 14 2020 at 15:47
Tu peux essayer,
- Grouper par semaine
db.collection.aggregate([
{
$group: { _id: { year: { $year: "$createdAt" }, week: { $week: "$createdAt" } }, createdAt: { $first: "$createdAt" }, count: { $sum: 1 }
}
}
])
Terrain de jeux
- Grouper par mois
db.collection.aggregate([
{
$group: { _id: { year: { $year: "$createdAt" }, month: { $month: "$createdAt" } }, createdAt: { $first: "$createdAt" }, count: { $sum: 1 }
}
}
])
Terrain de jeux
- Grouper par année
db.collection.aggregate([
{
$group: { _id: { $year: "$createdAt" }, createdAt: { $first: "$createdAt" }, count: { $sum: 1 }
}
}
])
Terrain de jeux
Vous pouvez changer le format de date de votre langue côté client en utilisant
createdAt
field!