【问题标题】:Sort MongoDB query by additional keyword按附加关键字对 MongoDB 查询进行排序
【发布时间】:2020-10-22 22:27:09
【问题描述】:

我正在 Flask + MongoDB 上为 HR 网站构建 REST Api。我需要按编程语言、经验、城市等过滤搜索结果。

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

框架本身作为字符串列在“关于”字段中,所以我使用正则表达式来查找它。

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

  1. 开发 A:Python、Flask、React
  2. 开发 B:Python、Flask、React
  3. 定义 C:Python、Flask

问题是第二个框架不是强制性的,当第一个框架是这样时,我无法使用“$or”或“$in”进行查询。我看到的唯一选择是查询第一个框架,然后根据第二个框架的存在对其进行排序。

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

【问题讨论】:

    标签: mongodb pymongo flask-mongoengine


    【解决方案1】:

    好的,经过一番研究,我找到了解决方案:

    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 次查找(第一个查找说 Flask AND React ('"Flask" "React"'),第二个查找 Flask AND NOT React ('"Flask" -"React" ')。我还必须向某些字段添加文本索引以执行文本查找。

    此外,您可能会注意到每个管道中都有一个 $sort 表达式。这是为了额外的排序(在我的例子中是评级)。聚合的第二个参数(排序规则)用于按整数对字符串字段进行排序。因此,您可以根据需要单独对每个查询进行排序,也可以将排序表达式移出管道并对整个查询进行排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 2019-01-13
      • 2019-03-30
      • 1970-01-01
      • 2021-10-29
      相关资源
      最近更新 更多