反向JSON查询:查找与对象匹配的集合中的所有查询

abb*_*bbr 5 mongodb nosql mongodb-query

我正在设计一个通用的通知订阅系统,用户可以根据MongoDB查询或更一般的json查询在订阅时指定复合规则.订阅数据存储在MongoDB集合中.例如,

{ "userId": 1, "rule": {"p1": "a"} }
{ "userId": 2, "rule": {"p1": "a", "p2": "b"} }
{ "userId": 3, "rule": {"p3": {$gt: 3} } }
Run Code Online (Sandbox Code Playgroud)

稍后当json对象形式的事件(如下所示)到达时,我想查找事件匹配的所有用户规则:

{"p1": "a", "p3": 4}
Run Code Online (Sandbox Code Playgroud)

上述事件应与示例中userId 1和3指定的规则匹配.事件对象不必存储在MongoDB中.

虽然我可以通过在应用层编写循环来满足要求.为了提高效率,我真的想在db层实现它,最好由于卷和延迟要求而允许分布式(分片)执行.

它可以实现吗?任何帮助表示赞赏.事实上,只要支持动态事件模式,我就可以使用其他NOSQL dbs,并且有一种指定复合规则的方法.

San*_*dri 7

你想要实现的目标是不可能的,至少在MongoDB中是这样.

如果您推断查询引擎的工作原理,您会发现这不是一个简单的解决方案.

在高级术语中,引擎将从您的查询生成一个条件对象,然后将对集合中的每个文档进行评估,这将导致一个布尔值,该值确定文档是否属于结果集.在你的情况下,你想要反过来做,你想要根据文档生成一个条件对象,然后将它应用于你给它的东西(例如一个对象).

即使有可能,在DB上执行此操作的成本也会过高,因为它需要为每个对象编译表达式函数并执行它,并且无法优化查询的执行.在数据库之外实际执行此操作更为合理,您可以在其中创建表达式函数.