假設我有一個資料
[
{
"_id": "629eb5ced774223d36a68907",
"userId": "629eb22698df1015e980a98f",
"posts": [
{
"_id": "629eb59ad774223d36a688fa",
"title": "titletestz",
"body": "bodyz",
"createdAt": "2022-06-07T02:19:06.314Z",
"updatedAt": "2022-06-07T02:19:06.314Z",
"__v": 0
},
{
"_id": "629eb59ad774223d36a688fc",
"title": "titletestx",
"body": "bodyx",
"createdAt": "2022-06-07T02:19:06.879Z",
"updatedAt": "2022-06-07T02:19:06.879Z",
"__v": 0
}
],
"createdAt": "2022-06-07T02:19:58.206Z",
"updatedAt": "2022-06-07T02:19:58.206Z",
"__v": 0
},
{
"_id": "629ebf8b775b5cd326b1c41c",
"userId": "629eb22698df1015e980a98f",
"posts": [
{
"_id": "629eb22c98df1015e980a995",
"title": "ttle3",
"body": "ttile3",
"createdAt": "2022-06-07T02:04:28.787Z",
"updatedAt": "2022-06-07T02:04:28.787Z",
"__v": 0
}
],
"createdAt": "2022-06-07T03:01:31.065Z",
"updatedAt": "2022-06-07T03:01:31.065Z",
"__v": 0
}
]
我想計算特定用戶的帖子
let start = new Date()
start = start.setHours(0,0,0,0)
let end = new Date()
end = start.setHours(23,59,59,999)
model.aggregate([
{
$match: {
userId,
createdAt: {
$gte: start,
$lt: end
}
}
},
{
$unwind : '$posts',
},
{
$count: 'count'
}
])
現在它確實有效
[
{
"total": 3
}
]
0但是,如果它不包含任何帖子,我想設定用戶的默認值,如下所示:
[
{
"total": 0
}
]
現在,[]如果用戶沒有任何帖子,我只會得到一個空陣列的回應。
知道如何在 mongo 中使用聚合來實作這一點嗎?
uj5u.com熱心網友回復:
unwind如果可能的話,你最好避免。簡單的方法是增加每個檔案$group上$sum的帖子數量。如果沒有此用戶的帖子,這將回傳 0。如果需要,您可以在多個用戶上一起運行它
編輯:用于$facet解決沒有檔案的用戶:
db.collection.aggregate([
{
$facet: {
count: [{
$match: {
userId,
createdAt: {$gte: start, $lt: end}
}
},
{$group: {_id: "$userId", total: {$sum: {$size: "$posts"}}}}
]},
{
$project: {
total: {$ifNull: [{$arrayElemAt: ["$count.total", 0]}, 0]}}
}
])
看看它在操場上的例子是如何作業的
uj5u.com熱心網友回復:
使用$facet和$ifNull
蒙哥游樂場
db.collection.aggregate([
{
"$facet": {
count: [
{
$match: {
userId,
createdAt: {
$gte: start,
$lt: end
}
}
},
{ $unwind: "$posts" },
{ "$count": "total" }
]
}
},
{
"$project": {
"total": {
"$ifNull": [
{ "$arrayElemAt": ["$count.total", 0] },
0
]
}
}
}
])
uj5u.com熱心網友回復:
它將在沒有匹配項時回傳空陣列。
let start = new Date()
start = start.setHours(0,0,0,0)
let end = new Date()
end = start.setHours(23,59,59,999);
db.collection.aggregate(
[
{
$match: {
userId,
createdAt: {
$gte: start,
$lt: end
}
}
},
{
$group: {
'$posts'
}
},
{
$count: "totalCount"
}
]
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/490199.html
