如何找到包含与另一个集合中的文档中的字段匹配的字段的MongoDB文档?

时间:2014-10-14 05:46:51

标签: mongodb

我有一个包含“主机”字段的文档的集合,我正在尝试将它与具有相同主机的非常大的集合中的文档进行匹配。这两个集合都是一百万份文件。我还在搞清楚Mongo,但我相信我可以粗暴地做,用Javascript迭代。有更有效的方法吗?

1 个答案:

答案 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 Modelingaggregation framework的文档。结合使用,它们可以回答您对数据的疑问。 ;)

相关问题