在MongoDb中使用图形数据库来查找“朋友”的“朋友”

6
我一直在调查图形数据库,发现了neo4j,虽然这似乎很理想,但我也发现了Mongodb。
Mongodb不是官方的图形数据库,但我想知道它是否适用于我的情况。
我正在编写一个应用程序,用户可以有朋友,这些朋友可以有朋友等等,典型的社交网络部分。
我想知道在我的情况下,Mongodb是否足够。实现起来有多容易,或者我真的需要专注于真正的图形数据库?
我注意到foursquare正在使用Mongodb,所以我认为它支持他们的基础设施。
但是,例如,查找所有我的朋友的朋友中也有共同朋友的人会有多容易呢?

MongoDB在这方面无法与真正的图形数据库竞争。 - Sammaye
1
Foursquare使用MongoDB的原因可能是他们的应用程序涉及很多地理信息。 MongoDB非常适合这种情况,因为它具有地理空间索引和查询功能。这是我所知道的唯一具有专门用于GPS坐标搜索的查询运算符的数据库。 - Philipp
2个回答

6
虽然并非完全不可能,但 MongoDB 并不适合这种情况。原因在于 MongoDB 不支持 JOIN 操作。当你需要跨多个文档进行查询时,就需要为每个文档执行单独的查询。
在你的例子中,每个 user 文档都会有一个包含他们朋友 _id 的数组。要查找“UserA 的所有朋友中也是 UserB 的朋友的人”,就需要:
1. 找到 userA 并获取其朋友数组 2. 查找该数组中的所有用户,并获取他们的朋友数组 3. 查找这些数组中所有包含 UserB 的用户
这三个查询都需要执行。在这些查询之间,结果集必须发送到应用程序,应用程序必须构建新的查询并将其发送回数据库。从第二个查询返回的结果集可能非常大,这意味着第三个查询可能需要一段时间。
简言之,选择正确的工具才能更好地完成任务。当你的数据是基于图形结构的,且想要对其进行基于图形的查询时,请使用图形数据库。

@rodi 你可以运行map-reduce来从不同的集合中收集数据。但是考虑到MongoDB只能使用单线程运行map-reduce函数,我不会依赖它。最好选择Neo4j或类似的图形数据库来处理这些查询。但是你仍然可以通过使用Mongo River等工具定期将实体数据从MongoDB复制到图形数据库来结合MongoDB和图形数据库。 - Ömer Faruk Almalı

1
你可能需要一个真正的图形数据库,而不是MongoDB。尝试使用TinkerPop图技术栈开始使用。使用Blueprints(类似于面向图形的JDBC),您可以查看MongoDB作为图形(使用Blueprints MongoDB实现)与Neo4jTitan或任何其他图形实现的性能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接