【发布时间】:2017-10-10 03:40:52
【问题描述】:
在挖掘谷歌和 SO 一周后,我最终在这里提出了这个问题。假设有两个集合,
用户集合:
[
{...
name:"James"
userregex: "a|regex|str|here"
},
{...
name:"James"
userregex: "another|regex|string|there"
},
...
]
PostCollection:
[
{...
title:"a string here ..."
},
{...
title: "another string here ..."
},
...
]
我需要获取所有userregex 将匹配任何post.title 的用户(需要 user_id、post_id 组或类似的东西)。
到目前为止我已经尝试过:
1.收集所有用户,在所有产品上运行正则表达式,工作但太脏!它必须为每个用户执行一个查询
2.同上,但在Mongo查询中使用foreach,同上,只是数据库层而不是应用层
我搜索了很多可用的方法,例如聚合、逆风等,但没有运气。
那么在Mongo中可以做到这一点吗?我应该更改我的数据库类型吗?如果是的话,什么类型会好?性能是我的首要任务。谢谢
【问题讨论】:
-
由于这似乎是您不需要为特定用户执行的操作,因此可能需要进行昂贵的计算(无论如何您都无法绕过)并将结果缓存在内存中。听起来这可能是一个 AB 问题。
-
@IngoBürk 我无法缓存结果,新数据来自 PostCollection 和 UsersCollection 也得到了更新。也许使用一些标志来处理新的\更改的文档,但它太脏了
-
添加帖子不会改变缓存结果。只有删除它们才会,并且您可以通过记住与用户匹配的帖子来解释(如果这是已删除的帖子,请为受影响的用户重新计算)。而添加用户时,您只需计算单个用户的信息并将其添加到缓存中。
-
你做过类似stackoverflow.com/a/22739813/4110233的事情对吧?
-
您的正则表达式是否都只是像您的示例中那样通过管道传输“或”单个关键字?如果是这样,您也许可以将它们存储在一个数组中并使用聚合框架进行 $lookup。