gpt4 book ai didi

mongodb - 聚合查询的 Mongo 性能极慢

转载 作者:行者123 更新时间:2023-12-05 05:36:02 25 4
gpt4 key购买 nike

希望有人可以帮助解决缓慢的 Mongo 查询 - 它在较小的集合上运行良好,但是一旦我们针对较大的生产集合测试它,它就会失败并显示消息“磁盘空间不足”,即使我们将结果集限制为100.

我觉得查询结构和/或适当的索引有问题

这两个集合都是约 500 万条记录。

我们需要帮助来加快查询速度。

// divide these by 1000 because the ts field isn't javascript milliseconds
const startDate = (ISODate("2022-07-01T00:00:00.000Z").getTime()/1000)
const endDate = (ISODate("2022-08-10T00:00:00.000Z").getTime()/1000)
const clientId = xxxx
const ordersCollection = "orders"
const itemsCollection = "items"

db[ordersCollection].aggregate(
[
{
$lookup: {
from: itemsCollection,
localField: "data.id",
foreignField: "data.orders_id",
as: "item"
}

},
{
$unwind: "$item"
},
{
$match: {"data.client_id": clientId}
},
{
$match: {"item.ts": {$gt: startDate, $lt: endDate}}
},

{
$project: {
order_id: "$data.id",
parent_id: "$data.parent_id",
owner_id: "$data.owner_id",
client_id: "$data.client_id",
ts: "$item.ts",
status: {
$cond: {
if: {$eq: ["$item.data.status",10] },then: 3,
else: {
$cond: { if: { $eq: ["$item.data.status",4] },
then: 2,
else: "$item.data.status"
}
}
}
}
}
},

{$group: { _id: {"order_id": "$order_id", "status": "$status"},

order_id: {$first:"$order_id"},
parent_id: {$first:"$parent_id"},
owner_id: {$first:"$owner_id"},
client_id: {$first:"$client_id"},
ts: {$first:"$ts"},
status:{$first:"$status"}

}},

{$sort: {"ts": 1}}

]
).limit(100).allowDiskUse(true)

最佳答案

尝试在主集合上拉动 $match
通过这种方式,您可以限制需要$lookup 的文档数量(否则我们将尝试在其他包含 500 万个文档的集合中查找 500 万个文档)。

确保在 data.client_id 上有一个索引。

db[ordersCollection].aggregate(
[
{
$match: {"data.client_id": clientId}
},
{
$lookup: {
from: itemsCollection,
localField: "data.id",
foreignField: "data.orders_id",
as: "item"
}
},
{
$unwind: "$item"
},
{
$match: {"item.ts": {$gt: startDate, $lt: endDate}}
},
...

作为旁注,将结果集限制为 100 没有帮助,因为最重的部分 - 无法限制带有查找和分组的聚合。

关于mongodb - 聚合查询的 Mongo 性能极慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73368754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com