我有一个MongoDb集合,其中包含成千上万个租户的数据,这些数据由包含租户ID的字段分隔。
我想执行一个查询,其中包括针对特定租户的全文搜索和构面(请参见下文)。
由于$ searchBeta必须是聚合管道的第一阶段,因此这意味着它将从所有租户中返回大量文档,只是为了在$ match阶段将其过滤掉,而不是使用索引。
有没有更有效的方法来执行这样的查询?
使用$ searchBeta运行它需要14秒钟,而删除它会将查询时间减少到6ms(而分面适用于更多文档,因为它包含所有租户的数据)。
*使用Doug的答案可以将其减少到〜70-120ms。
*时间测量是在Atlas免费套餐上完成的,因此并不意味着过多
db.tenantData.aggregate( [
{
$searchBeta: {
"search": {
"query": "test",
"path": ["name","comment"],
}
}
},
{
$match: {tenant:"tenant1"},
},
{
$facet: {
"AssetTypeFacet": [
{ $sortByCount: "$assetType" }
],
"manufacturerFacet": [
{ $sortByCount: "$manufacturer" }
]
}
}
])
答案 0 :(得分:1)
您可以将查询合并为compound,如下所示:
db.tenantData.aggregate([
{
$searchBeta: {
compound: {
should: {
search: { query: "test", path: ["name", "comment"] },
},
filter: {
search: { query: "tenant1", path: "tenant" },
},
},
},
},
{
$facet: {
AssetTypeFacet: [{ $sortByCount: "$assetType" }],
manufacturerFacet: [{ $sortByCount: "$manufacturer" }],
},
},
]);
这将消除与$match
关联的IO。除了您完成的操作外,目前没有其他方法可以直接在$searchBeta
中进行刻面。