2

我有两个包含以下详细信息的集合:

注释

{"_id" : ObjectId("521588ccb5d44d23aca151a2"), "UserId" : "5215862eb5d44d23aca1519d", "Comment" : "hello" }
{"_id" : ObjectId("521588ccb5d44d23aca151a3"), "UserId" : "5215862eb5d44d23aca1519e", "Comment" : "this is cool" }

“评论”:“你好”} {“_id”:ObjectId(“521588ccb5d44d23aca151a4”),“UserId”:“5215862eb5d44d23aca1519e”,“评论”:“我喜欢 mongo”}

用户

{ "_id" : ObjectId("5215862eb5d44d23aca1519d"), "Nickname" : "Jane"}
{ "_id" : ObjectId("5215862eb5d44d23aca1519e"), "Nickname" : "Jon"}

我将如何使用 MapReduce 实现以下目标(它是否最适合手头的任务)?理想情况下,该集合也可能非常大。即数十万或数百万。

{ "UserId" : "5215862eb5d44d23aca1519d", "Comment": "Hello", "Nickname" : "Jane"}
{ "UserId" : "5215862eb5d44d23aca1519e", "Comment": "this is cool", "Nickname" : "Jon"}
{ "UserId" : "5215862eb5d44d23aca1519e", "Comment": "I like Mongo", "Nickname" : "Jon"}

Bote:我正在使用带有 .NET C# 驱动程序的 MongoDB。

4

1 回答 1

1

MapReduce 不是这个任务的好工具,因为 MapReduce 查询总是在单个集合上执行。您必须在一个集合上执行 MapReduce,并在映射函数中从另一个集合中读取。但是文档明确警告您不应该这样做:“reduce 函数不应该访问数据库,即使执行读取操作”

MongoDB 通常不是为执行 JOIN 操作而设计的。

你可以做什么:

解决方案A:在应用层执行JOIN。首先查询评论集合,然后在第二个查询中使用结果查询用户集合。

解决方案 B:在评论文档中存储作者昵称的副本,这样您就不必查询用户集合(在面向文档的数据库中,冗余不像关系数据库中那样邪恶)。

于 2013-08-26T11:31:55.990 回答