mongodb - 反向 JSON 查询 : find all queries in a collection matching an object

标签 mongodb mongodb-query nosql

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

{ "userId": 1, "rule": {"p1": "a"} }
{ "userId": 2, "rule": {"p1": "a", "p2": "b"} }
{ "userId": 3, "rule": {"p3": {$gt: 3} } }

稍后当一个json对象形式的事件到来时,比如下面的,我想找到所有的用户规则事件匹配:

{"p1": "a", "p3": 4}

上述事件应符合示例中 userId 1 和 3 指定的规则。事件对象不必存储在 MongoDB 中。

虽然我可能通过在应用层编写一个循环来满足要求。为了提高效率,我真的想在数据库层实现它,由于容量和延迟要求,最好允许分布式(分片)执行。

它可以实现吗?任何帮助表示赞赏。事实上,我对其他 NOSQL 数据库持开放态度,只要支持动态事件模式,并且有一种方法可以指定复合规则。

最佳答案

你想要达到的目标是不可能的,至少在 MongoDB 中是不可能的。

如果您对查询引擎的工作原理进行推理,您会意识到这并不是一个简单的解决方案。

在高级术语中,引擎将从您的查询中生成一个条件对象,然后针对集合中的每个文档进行评估,这将产生一个 bool 值,用于确定文档是否属于结果集。 在您的情况下,您想反其道而行之,您想根据文档生成一个条件对象,然后将其应用于您给它的东西(例如对象)。

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

关于mongodb - 反向 JSON 查询 : find all queries in a collection matching an object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38690045/

相关文章:

javascript - 如何在 MongoDB 中累积结果(使用 forEach?)?

MongoDB:如何使用_id 获取集合中的最新文档?

mongodb - 为什么在什么场景下使用 REST 更好? NoSQL

database - 哪个nosql数据库用于异构记录?

java - 如何让 Morphia 将字段的值设置为函数调用的返回值?

javascript - Mongoose 在更新时对多个字段进行自定义验证

java - 如何在java中构建嵌套的MongoDB查询?

Mongodb加入从String到ObjectId的_id字段

mongodb - 在 mongo 中设置单个位,以存储位掩码

javascript - 如何将参数传递给 Mongo 脚本