有一些推特資料,比如:
{
"id": 1432568863334539264,
"created_at": "2021-08-31 05:00:07",
"text": "在颶風伊達摧毀了八條輸電線路后,周日新奧爾良的大部分地區陷入黑暗。一個新的天然氣管道...",
"user_id": 807095。
},
{
"id": 1432578972844531714,
"created_at": "2021-08-31 05:40:17",
"text": "RT @nytimes: 在颶風 "艾達 "摧毀了八條輸電線路后,新奧爾良大部分地區在周日陷入黑暗。一個新的天然氣發電廠,...",
"user_id": 1414848022849245186,
"retweet_id": 1432568863334539264,
"retweet_user_id": 807095,
"user_mentions": [/span>
{
"id": 807095,
"indices": []。
3,
11
]
}
]
},
{>
"id": 1432578589107625990,
"created_at": "2021-08-31 05:38:46",
"text": "RT @nytimes: 在颶風 "艾達 "摧毀了八條輸電線路后,新奧爾良大部分地區在周日陷入黑暗。一個新的天然氣發電廠,...",
"user_id": 1345847262010875915,
"retweet_id": 1432568863334539264,
"retweet_user_id": 807095,
"user_mentions": [/span>
{
"id": 807095,
"indices": []。
3,
11
]
}
]
}
我想用一個單一的查找或聚合來解決:
找到在發布后的第一個小時內收到最多轉發的一般推文。 發布的一般推文。列印出該推文的ID和它在第一小時內收到的轉發數量。我的不起作用的腳本:
db.tweets_hurricane.aggregate( [
{$match: {retweet_id:{$exists:true}},
{$project: {_id: 0, id: '$id', retweet_id: '$retweet_id', format_date: { $toDate: '$created_at'}, format_date_end: { $add: [{$toDate: '$created_at'}, 1*60* 60*1000]}}。
{$group: {_id: '$retweet_id', count: {$sum: {$switch: {branches: [{case: {$lt: ['$format_date'/span>, db. tweets_hurricane.findOne({id: '$retweet_id'}, {format_date_end:1}]}, then: 1}], default: 0}}}}}。
{$sort: {count: -1}}。
])
uj5u.com熱心網友回復:
樣本資料讓人很難理解這個解決方案,但它應該是有效的:
db.tweets_hurricane.aggregate( [
//加入tweets和re-tweets。
{ $match: { retweet_id: { $exists: false } } },
{
$lookup:
{
from: "tweets_hurricane"/span>,
localField: "id",
foreignField: "retweet_id",
as: "retweets".
}
},
//過濾發布后第一個小時內創建的轉發。
{
$set: {
retweets: {
$filter: {
input: "$retweets"。
as: "tweet"。
cond: { $lt: ["$tweet. created_at", { $add: ["$created_at", 1000 * 60 * 60 ] }] }
}
}
}
},
// count number of retweets.
{ $set: { retweet_count: { $size: "$retweets" } } },
//限制最多轉發的推文。
{ $sort: { retweet_count: -1 }. },
{ $limit: 1 },
// finalize output
{
$project: {
id: 1,
retweet_count: 1, retweet_count.
}
}
])
uj5u.com熱心網友回復:
很抱歉花了這么長時間。我不得不生成假資料來測驗查詢。 這個查詢非常長,但它是我能想到的最有效的一個查詢。
注意:我使用$lookup來找到所有的轉發。但是我的機器上安裝的mongodb的版本是v4.4。所以我不得不使用一個較早的語法。查看$lookup的檔案,使用mongodb的簡潔語法v => 5.0。
演算法
1 - 找到所有的一般推文 2 - 對于每條一般的推文,通過檢查是否找到它的所有轉發的推文 - general_tweet_id === retweet_id,以及轉發和一般推文之間的毫秒差。 - 轉發和一般推文的 - 創建時間的毫秒之差為< 60*60*1000 (1小時) 3 - 在"$project "陳述句中計算轉發陣列的大小為num_of_retweets 4 - 將num_of_retweets按降序排列。 5 - 使用`$limit`來挑選第一個結果。
虛擬資料
const data = [
{ _id: "200"/span>, created_at: "2021-01-02 11:25:00" }。
{ _id: "201", created_at: "2021-01-02 12:19:00", retweet_id: "200" }。
{ _id: "202"/span>, created_at: "2021-01-02 11:59:00", retweet_id: "200" }。
{ _id: "203"/span>, created_at: "2021-01-02 12:19:00", retweet_id: "200" }。
{ _id: "204"/span>, created_at: "2021-01-02 12:17:00", retweet_id: "200" }。
{ _id: "205"/span>, created_at: "2021-01-02 11:57:00", retweet_id: "200" }。
{ _id: "206"/span>, created_at: "2021-01-02 12:17:00", retweet_id: "200" }。
{ _id: "207"/span>, created_at: "2021-01-02 12:16:00", retweet_id: "200" }。
{ _id: "208"/span>, created_at: "2021-01-02 13:45:00", retweet_id: "200" }。
{ _id: "209"/span>, created_at: "2021-01-02 13:29:00", retweet_id: "200" }。
{ _id: "210"/span>, created_at: "2021-01-02 13:22:00", retweet_id: "200" }。
{ _id: "211"/span>, created_at: "2021-01-01 05:28:00" }。
{ _id: "212"/span>, created_at: "2021-01-01 05:59:00", retweet_id: "211" }。
{ _id: "213"/span>, created_at: "2021-01-01 06:05:00", retweet_id: "211" }。
{ _id: "214"/span>, created_at: "2021-01-01 06:11:00", retweet_id: "211" }。
{ _id: "215"/span>, created_at: "2021-01-01 06:16:00", retweet_id: "211" }。
{ _id: "216"/span>, created_at: "2021-01-01 06:00:00", retweet_id: "211" }。
{ _id: "217"/span>, created_at: "2021-01-01 06:22:00", retweet_id: "211" }。
{ _id: "218"/span>, created_at: "2021-01-01 07:09:00", retweet_id: "211" }。
{ _id: "219"/span>, created_at: "2021-01-01 07:41:00", retweet_id: "211" }。
{ _id: "220"/span>, created_at: "2021-01-01 06:54:00", retweet_id: "211" }。
{ _id: "221"/span>, created_at: "2021-01-01 07:09:00", retweet_id: "211" }。
{ _id: "222"/span>, created_at: "2021-01-02 14:22:00" }。
{ _id: "223", created_at: "2021-01-02 14:56:00", retweet_id: "222" }。
{ _id: "224"/span>, created_at: "2021-01-02 15:00:00", retweet_id: "222" }。
{ _id: "225"/span>, created_at: "2021-01-02 15:00:00", retweet_id: "222" }。
{ _id: "226"/span>, created_at: "2021-01-02 15:01:00", retweet_id: "222" },
{ _id: "227"/span>, created_at: "2021-01-02 14:56:00", retweet_id: "222" }。
{ _id: "228"/span>, created_at: "2021-01-02 15:44:00", retweet_id: "222" }。
{ _id: "229"/span>, created_at: "2021-01-02 16:51:00", retweet_id: "222" }。
{ _id: "230"/span>, created_at: "2021-01-02 16:17:00", retweet_id: "222" }。
{ _id: "231"/span>, created_at: "2021-01-02 16:42:00", retweet_id: "222" }。
{ _id: "232"/span>, created_at: "2021-01-02 16:29:00", retweet_id: "222" }。
{ _id: "233"/span>, created_at: "2021-01-01 03:40:00" }。
{ _id: "234", created_at: "2021-01-01 04:22:00", retweet_id: "233" }。
{ _id: "235"/span>, created_at: "2021-01-01 04:31:00", retweet_id: "233" }。
{ _id: "236"/span>, created_at: "2021-01-01 04:24:00", retweet_id: "233" },
{ _id: "237", created_at: "2021-01-01 04:33:00", retweet_id: "233" }。
{ _id: "238"/span>, created_at: "2021-01-01 06:06:00", retweet_id: "233" }。
{ _id: "239"/span>, created_at: "2021-01-01 04:56:00", retweet_id: "233" }。
{ _id: "240", created_at: "2021-01-01 04:53:00", retweet_id: "233" }。
{ _id: "241"/span>, created_at: "2021-01-01 04:52:00", retweet_id: "233" }。
{ _id: "242"/span>, created_at: "2021-01-01 05:25:00", retweet_id: "233" }。
{ _id: "243"/span>, created_at: "2021-01-01 05:17:00", retweet_id: "233" },
]
聚合管線
注意:我把所有這些資料放入一個叫做test的集合中,這就是為什么你在from陳述句的$lookup域中看到"test"。把它改成你自己的集合名稱。
pipeline = [
{
$match: {
retweet_id: { $exists: false },
},
},
{
$lookup: {
from: "test",
let: { general_tweet_date: "$created_at"/span>, general_tweet_id: "$_id" }。
pipeline: [
{
$match: {
$expr: {
$and: [
{ $eq: ["$retweet_id", "$general_tweet_id"] 。},
{
$lte: [
{
$subtract: [
{ $toDate: "$created_at"/span> },
{ $toDate: "$$general_tweet_date" },
],
},
3600000,
],
},
],
},
},
},
{
$project: {
_id: 1,
},
},
],
as: "retweets"。
},
},
{
$project: {
num_of_retweets: { $size: "$retweets" },
},
},
{
$sort: { num_of_retweets: -1 },
},
{
$limit: 1,
},
];
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/324669.html
標籤:
