我正在嘗試查找User最后一天登錄的 s。
該userActivity欄位是 上的一個物件User。該userActivity物件包含一個稱為hourly日期陣列的欄位。我希望使用聚合查找每小時陣列包含大于一天前的日期的任何用戶。
用戶架構
{
userName:"Bob",
userActivity:
{"hourly":
[
"2022-05-09T02:31:12.062Z", // the user logged in
"2022-05-09T19:37:42.870Z" // saved as date object in the db
]
}
}
查詢無效
const oneDayAgo = new Date();
oneDayAgo.setDate(oneDayAgo.getDate() - 1);
const usersActiveToday = await User.aggregate([
{
$match: {
$expr: { $gt: [oneDayAgo, '$userActivity'] },
},
},
]);
如果今天是 9 月 13 日晚上 11 點,我希望上述結果顯示在 12 日至 13 日之間有活動的用戶。
相反,我讓所有用戶回傳。
uj5u.com熱心網友回復:
這可以被認為是一個 3 步程序
- 在每小時陣列中找到最大值并將其存盤在某個鍵中(此處
max) - 檢查最大值是否大于等于 oneDayAgo 時間戳
- 取消設定存盤最大值的鍵
作業代碼片段:
const oneDayAgo = new Date();
oneDayAgo.setDate(oneDayAgo.getDate() - 1);
const usersActiveToday = await User.aggregate([
{
$set: {
max: {
$max: {
$map: {
input: "$userActivity.hourly",
in: {
$max: "$$this",
},
},
},
},
},
},
{
$match: {
max: {
$gte: oneDayAgo.toISOString(),
},
},
},
{
$unset: "max",
},
]);
這是實際代碼:Mongo Playground
uj5u.com熱心網友回復:
您可以嘗試以下方法:
db.collection.aggregate([
{
"$addFields": {
"loggedInADayBefore": {
"$anyElementTrue": [
{
"$map": {
"input": "$userActivity.hourly",
"as": "time",
"in": {
"$gte": [
"$$time",
ISODate("2022-05-13T00:00:00.000Z")
]
}
}
}
]
}
}
},
{
"$match": {
loggedInADayBefore: true
}
},
{
"$project": {
loggedInADayBefore: 0
}
}
])
在這里,我們$anyElementTrue要查找陣列中的任何元素hourly是否大于前一天,并將其作為布林值存盤在新欄位中。然后我們使用該欄位過濾檔案$match。
這是操場鏈接。
uj5u.com熱心網友回復:
如果要使用聚合管道,則一種選擇是$filter在陣列中查找大于 的項oneDayAgo:
db.collection.aggregate([
{$match: {
$expr: {
$gt: [
{$size: {
$filter: {
input: "$userActivity.hourly",
cond: {$gte: ["$$this", oneDayAgo]}
}
}
}, 0]
}
}
}
])
看看它在操場上的例子是如何作業的 - 聚合
但是,您也可以簡單地使用find:
db.collection.find({
"userActivity.hourly": {
$gte: ISODate("2022-05-13T00:00:00.000Z")
}
})
查看它在操場示例中的作業原理 - 查找
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/507575.html
標籤:javascript mongodb 猫鼬 mongodb查询 聚合框架
上一篇:如何洗掉生產分支中的所有評論
下一篇:使用正則運算式捕獲文本
