Avn*_*evy 5 mongodb mongodb-atlas mongodb-atlas-search
我有一个 MongoDb 集合,其中包含数千个租户的数据,这些租户由保存租户 ID 的字段分隔。
我想执行一个查询,其中包括对特定租户的全文搜索和分面(见下文)。
由于 $searchBeta 必须是聚合管道中的第一阶段,这意味着它将返回来自所有租户的大量文档列表,只是为了在 $match 阶段过滤掉它们,而不是使用索引。
有没有更有效的方法来执行这样的查询?
使用 $searchBeta 运行它需要 14 秒,而删除它会将查询时间减少到 6 毫秒(而分面适用于更多文档,因为它包含所有租户的数据)。
* 使用下面 Doug 的答案将其减少到 ~70-120ms。
* 时间测量是在 Atlas 免费套餐上完成的,因此意义不大
db.tenantData.aggregate( [
{
$searchBeta: {
"search": {
"query": "test",
"path": ["name","comment"],
}
}
},
{
$match: {tenant:"tenant1"},
},
{
$facet: {
"AssetTypeFacet": [
{ $sortByCount: "$assetType" }
],
"manufacturerFacet": [
{ $sortByCount: "$manufacturer" }
]
}
}
])
Run Code Online (Sandbox Code Playgroud)
您可以将查询组合成复合形式,如下所示:
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" }],
},
},
]);
Run Code Online (Sandbox Code Playgroud)
这将消除与 相关的 IO $match。$searchBeta目前除了您已经完成的方式之外,没有其他方法可以直接进行分面。
| 归档时间: |
|
| 查看次数: |
1098 次 |
| 最近记录: |