我有一个包含“主机”字段的文档的集合,我正在尝试将它与具有相同主机的非常大的集合中的文档进行匹配。这两个集合都是一百万份文件。我还在搞清楚Mongo,但我相信我可以粗暴地做,用Javascript迭代。有更有效的方法吗?
答案 0 :(得分:1)
在RDBMS中,这将是一个JOIN,在Mongo星球上不存在。
这实际上取决于您的用例和数据模型。 RDBMS和NoSQL数据库之间数据建模的不同之处在于,您可以通过“我有哪些数据可以提供哪些答案?”来为前者进行数据建模。而后者的数据建模是通过“我必须通过数据回答哪些问题?”这个问题来完成的。
如果您有一个给定的主机,问题很简单:“集合B中的哪些主机与我拥有的给定主机匹配?”假设您已通过_id
字段链接了文档。然后你只需要做
db.B.find({fieldToMatch:<givenHostsIdValue>})
e.g。
db.B.find({runningOnHost:e67848a7282919ac})
如果您必须将所有主机关联到第二个表,您可能(并且很可能会)通过将主机数据嵌入到另一个表中来对数据进行非规范化。例如,当您尝试跟踪必须在任何给定主机上运行的所有服务时,您的建模可能如下所示:
{
_id:e67848a7282919ac,
processes:['httpd', 'mongod', 'varnish'],
running:[’httpd’,’varnish’]
host: {
hostname: "web1.emea.mycompany.com",
ip:10.0.0.1,
datacenter: "EMEA"
}
}
这将完整地描述(“文档”)主持人,你可以对这个集合做几个有趣的问题:
db.hosts.find({processes:'httpd','host.datacenter':'us-east'})
在美国东部数据中心找到所有指定的Web服务器或
db.hosts.find({'host.hostname':/emea.mycompany.com/},{host:1,processes:1,running:1})
获取正在运行的进程以及应该为域emea.mycompany.com
的所有主机运行的进程。使用聚合框架,您甚至可以对该集合执行极其复杂的查询。
请深入了解有关Data Modeling和aggregation framework的文档。结合使用,它们可以回答您对数据的疑问。 ;)