Mongo以最大值匹配的顺序获得结果

时间:2017-06-14 19:16:29

标签: mongodb mongoose mongodb-query

我有这样的文件:

{
   {
      name: 'The best book'
   },

   {
      name: 'The book is the best on Sachin'
   },

   {
      name: 'Best book on Sachin Tendulkar'
   }

}

我搜索了regex mongo查询:

db.getCollection('books').find({ $in: [/sachin/i, /tendulkar/i, /best/i, /book/i]})

它正在给出结果,但根据我的要求,它应该按照最大匹配的排序顺序给出结果:

{
    name: 'Best book on Sachin Tendulkar'      (4 matches)
},
{
    name: 'The book is the best on Sachin'     (3 matches)  
},
{
    name: 'The best book'                       (2 matches)
}

我是mongo的新手。请帮我写mongo查询以获得结果。

1 个答案:

答案 0 :(得分:1)

在这种情况下,最好的选择可能是使用聚合框架(https://docs.mongodb.com/v3.2/reference/operator/aggregation/)。 我会这样做的。

  1. 将文字拆分为单词数组
  2. 将要匹配的标记数组与步骤1中生成的数组相交。
  3. 将交叉点的大小投影到字段
  4. 按第3步中投射的字段排序。
  5. 沿着这些方向的东西

    db.books.aggregate([
        {$match: {}},
        {$project: {
            name: {$toLower: "$name"},
            ... any other amount of fields ...
        }},
        {$project: {
            name: true,
            ... any other amount of fields ...
            wordArray: {$split: ["$name", " "]}
        }},
        {$project: {
            name: true,
            ... any other amount of fields ...
            wordArray: true,
            numberOfMatches: {
                $size: {
                    $setIntersection: ["$wordArray", ["best", "book"]]
                }
            }
        }},
        {$sort: {
            numberOfMatches: -1
        }}
    ]);
    

    请注意,您可以将条件设​​置为$match: {},并过滤您正在分类的初始图书集。

    我不确定这是否适用于正则表达式,所以我添加了第一个$ project阶段,以确保您始终将小写与小写进行比较

相关问题