通过多租户集合使用MongoDb Atlas全文搜索($searchBeta)

通过多租户集合使用MongoDb Atlas全文搜索($searchBeta),mongodb,mongodb-atlas,mongodb-atlas-search,Mongodb,Mongodb Atlas,Mongodb Atlas Search,我有一个MongoDb集合,其中包含数千个租户的数据,这些租户由一个包含租户ID的字段分隔开来。 我想执行一个查询,其中包括对特定租户的全文搜索和面处理(见下文)。 由于$searchBeta必须是聚合管道中的第一个阶段,这意味着它将返回来自所有租户的大量文档列表,只是为了在$match阶段过滤它们,而不是使用索引。 有没有更有效的方法来执行这样的查询? 使用$searchBeta运行它需要14秒,而删除它会将查询时间减少到6毫秒(而faceting可以处理更多文档,因为它包含所有租户的数据)。

我有一个MongoDb集合,其中包含数千个租户的数据,这些租户由一个包含租户ID的字段分隔开来。
我想执行一个查询,其中包括对特定租户的全文搜索和面处理(见下文)。
由于$searchBeta必须是聚合管道中的第一个阶段,这意味着它将返回来自所有租户的大量文档列表,只是为了在$match阶段过滤它们,而不是使用索引。
有没有更有效的方法来执行这样的查询?
使用$searchBeta运行它需要14秒,而删除它会将查询时间减少到6毫秒(而faceting可以处理更多文档,因为它包含所有租户的数据)。
*使用下面道格的回答,将其减少到约70-120毫秒。
*时间测量是在Atlas free层上完成的,所以它并不意味着太多

db.tenantData.aggregate( [
{
    $searchBeta: {
        "search": {
        "query": "test",
        "path": ["name","comment"],
      }
    }
},
{
    $match: {tenant:"tenant1"},
},
{
    $facet: {
        "AssetTypeFacet": [
          { $sortByCount: "$assetType" }
        ],
        "manufacturerFacet": [
          { $sortByCount: "$manufacturer" }
        ]
    }
}
])    

您可以将查询合并为类似的:


这将消除与
$match
关联的IO。目前除了您的方式之外,没有其他方法可以直接在
$searchBeta
中进行切面处理。

在MongoDB手册中找不到$searchBeta……。这会不会给具有类似值的租户带来过滤风险?
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" }],
    },
  },
]);