【问题标题】:Mongodb "like" on multiple fields in aggregationMongodb在聚合中的多个字段上“喜欢”
【发布时间】:2021-12-07 10:35:03
【问题描述】:

所以我有一些有名字和名字的用户文档。 如果给定的输入“看起来像”那个全名,我想提供过滤它们的可能性。

user: {
   firstName: "foo",
   lastName: "name",
   ...
}

之前,我在 javascript 端通过测量输入和全名之间的相似度“分数”来执行此过滤器,但由于我实现了分页系统,所以我不能再这样做了。

现在我想找到一种方法在聚合端进行此操作。

我发现 this questionthis one 似乎是同一件事,但由于他们不直接使用聚合,我很难将其与我的案例联系起来。

我一直在考虑的一种方法是在聚合中使用 $where 运算符,然后使用 addField 对查询的每个结果进行“相似度得分”,然后使用aggregatePaginate 选项。

但在我看来,我不能在聚合中使用$where。有什么想法吗?

非常感谢! 凯夫:)

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    对于聚合,您可以使用$function 来执行自定义代码。但是这样就违背了分页的目的,因为 Mongo 必须为每个文档执行此代码,另外建议不要在 Mongo 中执行 js,因为它的性能有些差。

    您似乎只是使用了错误的数据库来完成这项工作,如果这是一项关键功能,我建议您尝试使用文本搜索数据库,例如 atlas searchelasticsearch

    如果更改数据库不是一个选项,并且此功能太重要而无法删除或替换。如果您提供有关评分如何运作的更多详细信息,可能会更容易给出完整的答案。

    【讨论】:

    • 嘿,是的,在我们的例子中,mongoDB 是错误的数据库,但遗憾的是,几个月来我一直要求更改这项技术,而这次管理层不允许我们......所以我不得不这样做。在当前的方式中,评分实际上非常简单,每次在全名中找到输入中的字符时,我们就增加一个计数器。但这不是一个固定的方法,如果需要,我们可以更改它以找到更好的解决方案,也许$regex 运算符应该有所帮助,但我不太确定如何,因为对我来说它需要有一个精确的模式(“ohn " 会找到 "john" 但不会找到 "jonn")
    • 如果这种方法不会破坏分页系统的性能提升,也许这种方法可以,我认为它不会
    • 所以基本上EllaAllen 的分数会非常接近,因为它们共享4 个字母?顺序不重要?
    • 是的,这很简单,而且制作得不是很好,但现在它可以完成这项工作^^
    • 但我还是愿意接受其他允许我们保持分页性能增益的方法
    猜你喜欢
    • 2018-06-16
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    相关资源
    最近更新 更多