我的 Node.js 应用程序中有一个 MongoDB 查询,我想对其进行优化以获得更好的性能。查询如下所示:
const CampaignStepHistoryList = await CampaignStepHistory.aggregate([
{
$match: {ClientID: new ObjectId(ClientID), UserID: new ObjectId(UserID), IsSentMail: true,
},
},
{
$addFields: {
MailSentDateByTimeZones_temp: {
$dateToString: {
format: "%Y-%m-%d",
date: "$MailSentDateByTimeZone",
},
},
},
},
{
$match:{
MailSentDateByTimeZones_temp: { $gte: "2024-01-01", $lte: "2024-03-21",
},
}
},
{
$lookup: {
from: "campaigns",
let: {
flag: false,
cID: "$CampaignID",
cId: "$ClientID",
uID: "$UserID",
},
pipeline: [
{
$match: {
$expr: {
$and: [{ $eq: ["$_id", "$$cID"] },
{ $eq: ["$UserID", "$$uID"] },
{ $eq: ["$ClientID", "$$cId"] },
],},},},
],
as: "C",
},
},
{
$unwind: {
path: "$C",
preserveNullAndEmptyArrays: false,
},
},
{
$count: "totalRecords"
}
])
获取 MongoDB 中包含 3300 万条记录的集合中的总记录数 如何在零秒内获得这么多记录。 我已经尝试通过索引,所以在零秒内是不可能的。
在不了解数据模型的情况下很难评估数据库性能,但这里有一个尝试:
const CampaignStepHistoryList = await CampaignStepHistory.aggregate([
{
$match: {
ClientID: new ObjectId(ClientID),
UserID: new ObjectId(UserID),
IsSentMail: true,
MailSentDateByTimeZone: { $gte: new Date("2024-01-01"), $lte: new Date("2024-03-21")}
},
},
{
$lookup: {
from: "campaigns",
let: {
flag: false,
cID: "$CampaignID",
cId: "$ClientID",
uID: "$UserID",
},
pipeline: [
{
$match: {
$expr: {
$and: [
{ $eq: ["$_id", "$cID"] },
{ $eq: ["$UserID", "$uID"] },
{ $eq: ["$ClientID", "$cId"] },
],
},
},
},
],
as: "C",
},
},
{
$unwind: {
path: "$C",
preserveNullAndEmptyArrays: false,
},
},
{
$count: "totalRecords"
}
])
可能非常小,您最好更有效地对数据建立索引,以进行查找。如果您只想对数据进行计数,那么最好将计数存储在其自己的行上,并使用查询的唯一属性作为关键