首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反向JSON查询:查找与对象匹配的集合中的所有查询

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

Stack Overflow用户
提问于 2016-08-01 02:01:11
回答 2查看 1.3K关注 0票数 5

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

代码语言:javascript
复制
{ "userId": 1, "rule": {"p1": "a"} }
{ "userId": 2, "rule": {"p1": "a", "p2": "b"} }
{ "userId": 3, "rule": {"p3": {$gt: 3} } }

稍后,当以json对象的形式出现的事件(如下面的事件)到达时,我希望找到事件机器的所有用户规则:

代码语言:javascript
复制
{"p1": "a", "p3": 4}

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

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

这能实现吗?任何帮助都是非常感谢的。事实上,只要支持动态事件模式,我对其他NOSQL开放,并且有一种指定复合规则的方法。

EN

回答 2

Stack Overflow用户

发布于 2016-08-01 18:01:54

您正在尝试实现的目标是不可能的,至少在MongoDB中是这样的。

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

在高级条件下,引擎将从查询中生成一个条件对象,然后根据该集合中的每个文档进行求值,从而得到一个布尔值,该值确定文档是否属于结果集。在您的情况下,您想做相反的事情,您想要基于文档生成一个条件对象,然后将它应用到您给它的某个东西(例如一个对象)。

即使有可能,在DB上这样做的成本也太高,因为它需要为每个对象编译表达式函数并执行它,因此无法优化查询的执行。更合理的做法是在数据库之外这样做,在那里您可以已经创建了表达式函数。

票数 7
EN

Stack Overflow用户

发布于 2016-09-08 01:10:50

不能将“比较查询运算符”存储在mongo数据库中,但可以这样做:

代码语言:javascript
复制
{ "userId": 1, "rule": {"p1": "a"} }
{ "userId": 2, "rule": {"p1": "a", "p2": "b"} }
{ "userId": 3, "rule": {"p3":  {"value": 3, "operator":"gt"} } }

您可以以字符串形式存储值和运算符,并且可以进行如下查询:

代码语言:javascript
复制
db.test.find({"rule.p3.comparator":"gt", "rule.p3.value":{$lt:4}})

注意,如果您的“运算符”"gt",则必须在查询中使用$lt (相反的比较运算符)。

完整的示例如下所示:

代码语言:javascript
复制
db.test.find({$or:[{"rule.p3.comparator":"gt", "rule.p3.value":{$lt:4}}, {"rule.p1":"a"}]})

此查询与所需的userId 1和3匹配。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38690045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档