簡體   English   中英

MongoDB 使用 $search 獲取總計數聚合管道

[英]MongoDB get total count aggregation pipeline with $search

我必須使用 MongoDB Atlas 中的搜索索引以及普通瀏覽功能來實現搜索。 這包括過濾、匹配、排序、跳過、限制(分頁)。 我制作了一個聚合管道來實現這一切。 首先我將搜索查詢推送到我的管道,然后匹配,然后排序,然后跳過,最后是限制查詢。

這是它的過程:

query = [];
query.push({
    $search: {
      index: 'default'
      text: {
        query: searchQuery
        path: {  }
      }
    }
  });
 query.push({
      $sort: sort,
    });
 query.push({
    $match: {
      type: match
    },

query.push({
  $skip: skip
});
query.push({
  $limit: perPage
});

let documents = await collection.aggregate(query);

到目前為止我得到的結果是正確的。 但是,對於分頁,我還想獲取文檔總數。 計數必須考慮“匹配”和“searchQuery”(如果有)。 我試過$facet但它給出了錯誤$_internalSearchMongotRemote is not allowed to be used in a $facet stage

所以,我看到了這個查詢的一些挑戰。

  1. 可能不需要$sort階段。 默認情況下,所有搜索查詢都按相關性分數排序。 如果您需要根據其他一些標准進行排序,那么它可能是合適的。

  2. 可能不需要$match階段。 大多數人在嘗試匹配時正在尋找的是復合過濾器。 正如您從文檔中看到的, filter行為類似於普通 MongoDB 中的$match 從我所在的位置來看,您的查詢可能類似於:

如果您想對返回的文檔進行快速計數,則需要使用新的計數運算符。 它在4.4.115.0.4集群上可用。 你可以在這里閱讀它。


query = [];
query.push({
    $search: {
      index: 'default'
      "compound": {
      "filter": [{
        "text": {
          "query": match,
          "path": type
        }
      }],
      "must": [{
        "text": {
          "query": searchQuery,
          "path": { }
        }
      }]
    }, 
     "count": {
      "type": "total"
     }
   }
  });

query.push({
  $skip: skip
});

query.push({
  $limit: perPage
});

let documents = await collection.aggregate(query);



  [1]: https://docs.atlas.mongodb.com/reference/atlas-search/compound/#mongodb-data-filter
  [2]: https://docs.atlas.mongodb.com/reference/atlas-search/counting/#std-label-count-ref

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM