我有兩個檔案——
const taskSchema = new mongoose.Schema({
leadId: { type: String, default: '' },
customer_name: { type: String, default: '' }
})
const leadSchema = new mongoose.Schema({
Id: { type: String, default: "" },
associate_status: { type: Boolean, default: false },
})
我想對任務運行查詢,以便獲得關聯狀態為真的所有潛在客戶。
LeadId在任務模式中與Id在引導模式中相同。
我試過這個 -
const report = await taskModel.aggregate([
{ $lookup: {
from: 'leads',
let: { leadId: '$leadId' },
pipeline: [
{
$match: {
$expr: {
$eq: ['$Id', '$$leadId'],
},
},
},
],
as: 'leaditems',
},
}
{ $unwind: '$leaditems' },
{ $match: { leaditems.associate_status: true}}
])
但由于我有大量檔案(超過 20 萬個潛在客戶和 10 萬個任務,而且這些數字會繼續增長),查詢有時會在 9 到 10 秒后運行,有時根本不運行。我正在尋找一種更優化的方法或任何其他可以使這項作業發揮作用的實作。
更新:
我也試過這個,但沒有改善 -
const report = await taskModel.aggregate([
{ $lookup: {
from: 'leads',
let: { leadId: '$leadId' },
pipeline: [
{
$match: {
$expr: {
$and: [
{
$eq: ['$Id', '$$leadId'],
},
{
$eq: ['$associate_status', true],
},
],
},
},
},
],
as: 'leaditems',
},
}
])
uj5u.com熱心網友回復:
將$match條件放入$lookup pipeline或什至嘗試將其放入之前$lookup。
index在兩個關聯的 id 上設定。
也許你的服務有一個 10 秒的資料庫連接限制,試著讓它更長。
uj5u.com熱心網友回復:
要在$exp查找管道中使用索引,您需要 MongoDB 5。MongoDB 4.4.9 不會使用索引,查詢會很慢。
- 在 Leads 和 Id 中創建索引,它預計會快得多
(如果它具有良好的選擇性,索引會有所幫助,如果選擇一小部分檔案,一個將回傳 90% 檔案的索引會使事情變得更糟)(如果你添加很多LeadId 索引上的值也將更新,這可能會產生成本,但大多數情況下的好處要多得多) - 替換為簡單的等式
$lookup - 此外,如果您真的不需要
$unwind并且更喜歡陣列中的資料,則可以使用$filter
const report = await taskModel.aggregate([
{ $lookup: {
from: 'leads',
localField: "leadId",
foreignField: "Id",
as : "leaditems"
},
{ $unwind: '$leaditems' },
{ $match: { leaditems.associate_status: true}}
])
如果可能的話,在你完成這些并發送一些反饋后對其進行基準測驗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/319270.html
標籤:javascript 节点.js MongoDB 猫鼬
