【问题标题】:MongoDB aggregation - grouping results by containing textMongoDB 聚合 - 通过包含文本对结果进行分组
【发布时间】:2019-05-23 01:57:56
【问题描述】:

我有以下类型的对象:

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

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

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

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

"$match" : {
                "$or" : [
                    {
                        "name" : /.*hellow world.*/i
                    }, 
                    {
                        "title" : /.*hellow world.*/i
                    }, 
                    {
                        "body" : /.*hellow world.*/i
                    }
                ]
            }
  • 另外,我正在使用分页。
  • 从 node.js 服务器请求的查询。

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

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

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    您可以使用$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" ]
                }
            }
        }
    ])
    

    【讨论】:

    • 哈!我在考虑分组或排序。谢谢你。
    猜你喜欢
    • 2013-10-12
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多