首页 > 解决方案 > MongoDB 聚合 - 通过包含文本对结果进行分组

问题描述

我有以下类型的对象:

"name":string,
"title": string,
"body": string

我需要执行聚合查询,以查找在某个字段中包含特定文本的对象。结果应按以下规则分组:

  1. 第一个名称包含文本的对象。
  2. 然后对象的标题包含文本。
  3. 然后是其主体包含文本的对象。

聚合的第一阶段如下所示:

"$match" : {
                "$or" : [
                    {
                        "name" : /.*hellow world.*/i
                    }, 
                    {
                        "title" : /.*hellow world.*/i
                    }, 
                    {
                        "body" : /.*hellow world.*/i
                    }
                ]
            }

我的第一个问题是我仍然没有弄清楚是否可以在聚合管道中执行这样的分组。

另外,我试图首先执行三个查询,以获取他们的名字包含术语的结果,然后是他们的标题和正文的结果。使用这种方法我几乎没有其他问题:对服务器的三个查询效率不高,而且管理分页也增加了整个过程的复杂性。

标签: mongodbmongoosemongodb-queryaggregation-framework

解决方案


您可以使用$facet单独应用您的条件,然后运行​​$concatArrays来合并结果:

db.col.aggregate([
    {
        $facet: {
            name: [ { $match: { "name" : /.*hello world.*/i } } ],
            title: [ { $match: { "title" : /.*hello world.*/i } } ],
            body: [ { $match: { "body" : /.*hello world.*/i } } ],
        }
    },
    {
        $project: {
            data: {
                $concatArrays: [ "$name", "$title", "$body" ]
            }
        }
    }
])

推荐阅读