Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按附加关键字对MongoDB查询排序_Mongodb_Pymongo_Flask Mongoengine - Fatal编程技术网

按附加关键字对MongoDB查询排序

按附加关键字对MongoDB查询排序,mongodb,pymongo,flask-mongoengine,Mongodb,Pymongo,Flask Mongoengine,我正在Flask+MongoDB上为人力资源网站构建RESTAPI。我需要过滤的编程语言,经验,城市等搜索结果 我还有一个过滤器“框架”。但是我还需要实现一个附加的框架过滤器,它“很好,但不是必需的”,我只需要对项目进行排序,包括附加的框架 框架本身作为字符串列在“about”字段中,因此我使用正则表达式来查找它 例如,我正在寻找一位Python开发人员,他必须具备烧瓶知识,但也很高兴知道React。所以我需要这样的搜索结果: deva:Python,Flask,React 开发人员B:Pyth

我正在Flask+MongoDB上为人力资源网站构建RESTAPI。我需要过滤的编程语言,经验,城市等搜索结果

我还有一个过滤器“框架”。但是我还需要实现一个附加的框架过滤器,它“很好,但不是必需的”,我只需要对项目进行排序,包括附加的框架

框架本身作为字符串列在“about”字段中,因此我使用正则表达式来查找它

例如,我正在寻找一位Python开发人员,他必须具备烧瓶知识,但也很高兴知道React。所以我需要这样的搜索结果:

  • deva:Python,Flask,React
  • 开发人员B:Python、Flask、React
  • defc:Python,Flask
  • 问题是第二个框架不是强制性的,而第一个框架是强制性的,所以我不能用“$or”或“$in”进行查询。我看到的唯一选择是查询第一个框架,然后根据第二个框架的存在对其进行排序


    有没有办法在MongoDB中实现它?

    好的,所以在做了一些研究之后,我找到了一个解决方案:

    def _filter_by_additional_framework(collection, query):
        results = collection.aggregate([
            {'$limit': 1},
            {'$lookup':
                {
                    'from': 'profiles',
                    'pipeline': [
                        {'$match': {
                            '$text': {
                                '$search': f"\"{query['framework']}\" \"{query['framework2']}\""}}
                        },
                        {'$sort': {'Rating': DESCENDING}}
                    ], 'as': 'col1'}},
            {'$lookup':
                {
                    'from': 'profiles',
                    'pipeline': [
                        {'$match': {
                            '$text': {
                                '$search': f"\"{query['framework']}\" -\"{query['framework2']}\""}}
                        },
                        {'$sort': {'Rating': DESCENDING}}
                    ], 'as': 'col2'}},
            {'$project': {'union': {'$concatArrays': ["$col1", "$col2"]}}},
            {'$unwind': '$union'},
            {'$replaceRoot': {'newRoot': '$union'}},
            {'$project': search_result_order()},
        ], collation=Collation(locale="en_US", numericOrdering=True))
    
        return results
    
    它通过集合中的同一字段执行2次查找(第一次查找say Flask AND React(““Flask”“React””),第二次查找Flask AND NOT React(““Flask”-“React””)。我还必须向某些字段添加文本索引以执行文本查找

    另外,您可能会注意到,每个管道中都有一个$sort表达式。这是用于附加排序(在我的例子中是分级)和第二个参数(排序规则)in aggregate用于按整数对字符串字段进行排序。因此,您可以按照自己的意愿对每个查询进行单独排序,也可以将排序表达式移出管道,对整个查询进行组合排序