Meteor

时间:2016-08-18 16:57:06

标签: mongodb meteor

简短的一句:我需要正则表达式搜索集合,将完美匹配移动到结果的第一个位置,然后限制结果。

长篇:

在出版物中,我需要自定义我的结果,然后(当然在排序后)限制它。

我的自定义排序类似于按相关性排序,但不完全是。鉴于这些文件:

{ number: '2123' } // let's call this one A
{ number: '21' } // and this one B
{ number: 'A2123' } // and this one C
{ number: '01' } // and this one D

如果我正在使用21这个词进行搜索,我想得到ABC。但是在第一个位置B。为什么?因为B匹配完美。你看?它并不完全按照相关性排序,而是将完美匹配(最多只有1个完美匹配)移动到第一个位置。

我尝试text indexes但是2123与搜索字词21不匹配。 (我理解为什么,那很好)

那究竟是什么问题?我可以正则表达式搜索并发布该光标,但它会有太多文档。我可以限制它但没有排序我可能会失去我绝对需要的完美匹配。

所以最后我无法自定义排序。然后我有了这个想法:为什么我fetch()我的光标(未分类和无限制),排序和限制获取的数组并基于该排序的数组创建一个“人工”光标。我找不到实现这一目标的方法。

1 个答案:

答案 0 :(得分:2)

这是一个有点黑客的想法:

  1. 订阅两个不同的出版物exactMatchesallMatches
  2. exactMatches应仅返回完全匹配,仅限于您的点数
  3. allMatches会返回所有匹配,也仅限于您的点数
  4. 现在,在客户端上,您可以.find().fetch()对该集合进行排序,并按优化顺序重新排列。

    这种方法可以(a)保证您看到所有完全匹配,(b)最小化网络流量,(c)将排序负载放在客户端而不是服务器上。

    想想看,你也可以在部分匹配之前单独渲染完全匹配,所以你只需要对后者进行排序。大火:

    {{#each exactMatches}}
      {{> result}}
    {{/each}}
    {{#each partialMatches}}
      {{>result}}
    {{/each}}