USER GROWTH
use Carbon\Carbon;
$total = Profile::where('created_at', '>=', Carbon::now()->subDays(7))->count();
DAU
SELECT COUNT(DISTINCT firebaseUID) AS total_unique_firebaseUID FROM log_user_login WHERE firebaseUID IS NOT NULL AND created_at >= DATE_SUB(NOW(), INTERVAL 1 DAY);
DAU WEEK
SELECT
DATE(created_at) AS tanggal,
COUNT(DISTINCT firebaseUID) AS total_unique_firebaseUID
FROM log_user_login
WHERE firebaseUID IS NOT NULL
AND created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY DATE(created_at)
ORDER BY tanggal DESC;
MAU
SELECT COUNT(DISTINCT firebaseUID) AS total_unique_firebaseUID FROM log_user_login WHERE firebaseUID IS NOT NULL AND created_at >= DATE_SUB(NOW(), INTERVAL 1 MONTH);
LAST 30 DAYS
SELECT
COUNT(DISTINCT firebaseUID) AS total_unique_firebaseUID
FROM log_user_login
WHERE firebaseUID IS NOT NULL
AND created_at >= CURDATE() - INTERVAL 30 DAY;
LAST WEEK
SELECT
DATE(created_at) AS tanggal,
COUNT(DISTINCT firebaseUID) AS total_unique_firebaseUID
FROM log_user_login
WHERE firebaseUID IS NOT NULL
AND created_at >= DATE_SUB(NOW(), INTERVAL 1 MONTH)
GROUP BY DATE(created_at)
ORDER BY tanggal DESC;
IN A MONTH
SELECT
DATE(created_at) AS tanggal,
COUNT(DISTINCT firebaseUID) AS total_unique_firebaseUID
FROM log_user_login
WHERE firebaseUID IS NOT NULL
AND created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')
GROUP BY DATE(created_at)
ORDER BY tanggal ASC;
SELECT
DATE_FORMAT(created_at, '%Y-%m') AS bulan,
COUNT(DISTINCT firebaseUID) AS total_unique_firebaseUID
FROM log_user_login
WHERE firebaseUID IS NOT NULL
AND created_at >= DATE_FORMAT(NOW(), '%Y-01-01')
GROUP BY DATE_FORMAT(created_at, '%Y-%m')
ORDER BY bulan ASC;
QUERY GROWTH USER BETWEEN DATE
$startDate = new \MongoDB\BSON\UTCDateTime(
strtotime(date('Y-m-01 00:00:00')) * 1000
);
$endDate = new \MongoDB\BSON\UTCDateTime(
strtotime(date('Y-m-t 23:59:59')) * 1000
);
$data = Profile::raw(function ($collection) use ($startDate, $endDate) {
return $collection->aggregate([
[
'$match' => [
'created_at' => [
'$gte' => $startDate,
'$lt' => $endDate,
]
]
],
[
'$group' => [
'_id' => [
'$dateToString' => [
'format' => '%Y-%m-%d',
'date' => '$created_at',
'timezone' => 'Asia/Jakarta'
]
],
'total' => ['$sum' => 1]
]
],
[
'$project' => [
'_id' => 0,
'tanggal' => '$_id',
'total' => 1
]
],
[
'$sort' => ['tanggal' => 1]
]
]);
});
FIND NEW MEMBER FROM KWARDA & KWARCAB
$data = Profile::raw(function ($collection) {
return $collection->aggregate([
[
'$match' => [
'kwarda' => 'JAWA TIMUR',
'kwarcab' => [
'$regex' => 'KAB. BOJONEGORO',
'$options' => 'i'
],
'created_at' => [
'$gte' => new \MongoDB\BSON\UTCDateTime(
strtotime('2026-02-17 00:00:00 UTC') * 1000
)
]
]
],
[
'$count' => 'total'
]
]);
});
$data = Profile::raw(function ($collection) {
return $collection->aggregate([
[
'$match' => [
'kwarda' => 'JAWA TIMUR',
'kwarcab' => [
'$regex' => 'KAB. BOJONEGORO',
'$options' => 'i'
],
]
],
[
'$count' => 'total'
]
]);
});
MULTI KWARCAB
$date = new \MongoDB\BSON\UTCDateTime(
strtotime('2026-03-01 00:00:00 UTC') * 1000
);
$kwarcabList = [
'BANYUWANGI',
'MADIUN',
'GRESIK',
'PONOROGO',
'KOTA SURABAYA',
'KAB. SIDOARJO',
'KAB. BOJONEGORO'
];
$data = Profile::raw(function ($collection) use ($date, $kwarcabList) {
return $collection->aggregate([
[
'$match' => [
'kwarda' => 'JAWA TIMUR',
'kwarcab' => [
'$in' => $kwarcabList
],
'created_at' => [
'$gte' => $date
]
]
],
[
'$group' => [
'_id' => '$kwarcab',
'total' => ['$sum' => 1]
]
],
[
'$project' => [
'_id' => 0,
'kwarcab' => '$_id',
'total' => 1
]
],
[
'$sort' => [
'kwarcab' => 1
]
]
]);
});
GROUP GOL PRAMUKA
$data = Profile::raw(function ($collection) use ($date, $kwarcabList) {
return $collection->aggregate([
[
'$match' => [
'kwarda' => 'JAWA TENGAH',
'kwarcab' => [
'$in' => $kwarcabList
],
'created_at' => [
'$gte' => $date
]
]
],
[
'$group' => [
'_id' => [
'kwarcab' => '$kwarcab',
'golPramuka' => '$golPramuka'
],
'total' => ['$sum' => 1]
]
],
[
'$group' => [
'_id' => '$_id.kwarcab',
'golPramuka' => [
'$push' => [
'golPramuka' => '$_id.golPramuka',
'total' => '$total'
]
],
'total' => [
'$sum' => '$total'
]
]
],
[
'$project' => [
'_id' => 0,
'kwarcab' => '$_id',
'total' => 1,
'golPramuka' => 1
]
],
[
'$sort' => [
'kwarcab' => 1
]
]
]);
});
FILTERED
$startDate = new \MongoDB\BSON\UTCDateTime(
strtotime(date('Y-m-01 00:00:00')) * 1000
);
$endDate = new \MongoDB\BSON\UTCDateTime(
strtotime(date('Y-m-t 23:59:59')) * 1000
);
$kwarda = 'JAWA BARAT';
$kwarcabList = [
'KAB. LEBAK',
'KOTA TASIKMALAYA',
'KAB. BEKASI',
'KAB. TANGERANG',
'KOTA JAKARTA TIMUR',
'KAB. SERANG',
'KAB. MAJALENGKA',
'KAB. CIREBON',
'KAB. CIANJUR',
'KAB. BANDUNG BARAT',
'KAB. BANDUNG',
'KAB. KARAWANG',
'KOTA JAKARTA BARAT'
];
$data = Profile::raw(function ($collection) use ($startDate, $endDate, $kwarda, $kwarcabList) {
return $collection->aggregate([
[
'$match' => [
'kwarda' => $kwarda,
'kwarcab' => [
'$in' => $kwarcabList
],
'created_at' => [
'$gte' => $startDate,
'$lte' => $endDate
]
]
],
[
'$group' => [
'_id' => '$kwarcab',
'total' => ['$sum' => 1],
'siaga' => [
'$sum' => [
'$cond' => [
['$eq' => ['$golPramuka', 'Siaga']],
1,
0
]
]
],
'penggalang' => [
'$sum' => [
'$cond' => [
['$eq' => ['$golPramuka', 'Penggalang']],
1,
0
]
]
],
'penegak' => [
'$sum' => [
'$cond' => [
['$eq' => ['$golPramuka', 'Penegak']],
1,
0
]
]
],
'pandega' => [
'$sum' => [
'$cond' => [
['$eq' => ['$golPramuka', 'Pandega']],
1,
0
]
]
],
'pembina' => [
'$sum' => [
'$cond' => [
[
'$not' => [
'$in' => [
'$golPramuka',
['Siaga', 'Penggalang', 'Penegak', 'Pandega']
]
]
],
1,
0
]
]
],
]
],
[
'$project' => [
'_id' => 0,
'kwarcab' => '$_id',
'total' => 1,
'siaga' => 1,
'penggalang' => 1,
'penegak' => 1,
'pandega' => 1,
'pembina' => 1,
]
],
[
'$sort' => [
'kwarcab' => 1
]
]
]);
})->toJson();
JJID
SELECT
p.id,
p.anggota_id,
p.jj_id,
p.jj_id_custom,
p.nama_lengkap,
p.nta,
p.email,
p.no_telp,
p.gudep_id,
p.is_member,
p.expired_date,
p.created_at,
s.id AS sekolah_id,
s.name AS sekolah_name,
o.id AS order_id_db,
o.order_id,
o.amount,
o.payment_date,
o.details,
o.status AS payment_status
FROM tm_jj_peserta p
LEFT JOIN tm_data_sekolah s
ON s.id = p.gudep_id
LEFT JOIN tt_jj_orders o
ON o.peserta_id = p.id
AND o.status = 'settlement'
WHERE p.is_member = 1
AND p.jj_id_custom IS NOT NULL
AND p.deleted_at IS NULL
AND o.payment_date >= '2026-01-01 00:00:00'
AND o.payment_date < '2027-01-01 00:00:00'
ORDER BY o.payment_date DESC;
RATA RATA JUMLAH TWEET 7 HARI TERAKHIR
db.tweet.aggregate([
{
$match: {
createdAt: {
$gte: new Date(new Date().setDate(new Date().getDate() - 6)),
$lt: new Date(new Date().setDate(new Date().getDate() + 1))
}
}
},
{
$group: {
_id: {
$dateToString: {
format: "%Y-%m-%d",
date: "$createdAt",
timezone: "Asia/Jakarta"
}
},
total: { $sum: 1 }
}
},
{
$sort: { _id: 1 }
}
]);