MongoDB(带有相关字段的文本搜索)聚合问题

时间:2018-11-05 14:53:57

标签: mongodb aggregation-framework

我有MongoDB聚合查询

db.data.aggregate([{ "$match" : { "$text" : { "$search" : "STORAGE TYPE" } } },

{ "$group" : 
                      { "_id" :{"doc_type": "$doc_type" ,"title" : "$title", "player_name" : "$player_name", "player_type" : "INSTITUTION", "country_code" :"$country_code" }, 
                       "number_records" : { "$sum" : 1}
  }
},
{"$match" : {"doc_type": "PATENT"} },
{"$sort":{"number_records" : -1}},
{"$limit" : 10}],

{"allowDiskuse" : true}

 )

当我尝试执行以上代码时,它会长时间保持缓冲,但没有任何输出。谁能帮我? 当我使用命令explain()时,它显示以下代码:

{
    "stages" : [
        {
            "$cursor" : {
                "query" : {
                    "$and" : [
                        {
                            "$text" : {
                                "$search" : "STORAGE TYPE"
                            }
                        },
                        {
                            "doc_type" : "PATENT"
                        }
                    ]
                },
                "fields" : {
                    "country_code" : 1,
                    "doc_type" : 1,
                    "player_name" : 1,
                    "title" : 1,
                    "_id" : 0
                },
                "queryPlanner" : {
                    "plannerVersion" : 1,
                    "namespace" : "datadocuments.data",
                    "indexFilterSet" : false,
                    "parsedQuery" : {
                        "$and" : [
                            {
                                "doc_type" : {
                                    "$eq" : "PATENT"
                                }
                            },
                            {
                                "$text" : {
                                    "$search" : "STORAGE TYPE",
                                    "$language" : "english",
                                    "$caseSensitive" : false,
                                    "$diacriticSensitive" : false
                                }
                            }
                        ]
                    },
                    "winningPlan" : {
                        "stage" : "FETCH",
                        "filter" : {
                            "doc_type" : {
                                "$eq" : "PATENT"
                            }
                        },
                        "inputStage" : {
                            "stage" : "TEXT",
                            "indexPrefix" : {

                            },
                            "indexName" : "title",
                            "parsedTextQuery" : {
                                "terms" : [
                                    "storag",
                                    "type"
                                ],
                                "negatedTerms" : [ ],
                                "phrases" : [ ],
                                "negatedPhrases" : [ ]
                            },
                            "textIndexVersion" : 3,
                            "inputStage" : {
                                "stage" : "TEXT_MATCH",
                                "inputStage" : {
                                    "stage" : "FETCH",
                                    "inputStage" : {
                                        "stage" : "OR",
                                        "inputStages" : [
                                            {
                                                "stage" : "IXSCAN",
                                                "keyPattern" : {
                                                    "_fts" : "text",
                                                    "_ftsx" : 1
                                                },
                                                "indexName" : "title",
                                                "isMultiKey" : true,
                                                "isUnique" : false,
                                                "isSparse" : false,
                                                "isPartial" : false,
                                                "indexVersion" : 2,
                                                "direction" : "backward",
                                                "indexBounds" : {

                                                }
                                            },
                                            {
                                                "stage" : "IXSCAN",
                                                "keyPattern" : {
                                                    "_fts" : "text",
                                                    "_ftsx" : 1
                                                },
                                                "indexName" : "title",
                                                "isMultiKey" : true,
                                                "isUnique" : false,
                                                "isSparse" : false,
                                                "isPartial" : false,
                                                "indexVersion" : 2,
                                                "direction" : "backward",
                                                "indexBounds" : {

                                                }
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "rejectedPlans" : [ ]
                }
            }
        },
        {
            "$group" : {
                "_id" : {
                    "doc_type" : "$doc_type",
                    "title" : "$title",
                    "player_name" : "$player_name",
                    "player_type" : {
                        "$const" : "INSTITUTION"
                    },
                    "country_code" : "$country_code"
                },
                "number_records" : {
                    "$sum" : {
                        "$const" : 1
                    }
                }
            }
        },
        {
            "$sort" : {
                "sortKey" : {
                    "number_records" : -1
                },
                "limit" : NumberLong("10")
            }
        }
    ],
    "ok" : 1
}

我无法弄清楚这个错误;聚合中是否有任何问题,如果没有,如何提高性能?

1 个答案:

答案 0 :(得分:0)

您的错误来自于您的第二个比赛阶段:目前,doc_type不存在,但_id.doc_type。但是您最好将此阶段与第一个阶段合并,以通过减少传递到$ group阶段的文档数量来提高性能。

您改进后的查询将是:

db.data.aggregate([
  {"$match" : { "$text" : { "$search" : "STORAGE TYPE" `},"doc_type": "PATENT" } },`
  { "$group" : 
                      { "_id" :{"doc_type": "$doc_type" ,"title" : "$title", "player_name" : "$player_name", "player_type" : "INSTITUTION", "country_code" :"$country_code" }, 
                       "number_records" : { "$sum" : 1}
  }
},
  {"$sort":{"number_records" : -1}},
  {"$limit" : 10}],

{"allowDiskuse" : true}

 )