我有两个MongoDB
集合:第一个集合包含不同id的频率信息,如下所示(截断形式):
[
{
"_id" : "A1",
"value" : 19
},
{
"_id" : "A2",
"value" : 6
},
{
"_id" : "A3",
"value" : 12
},
{
"_id" : "A4",
"value" : 8
},
{
"_id" : "A5",
"value" : 4
},
...
]
第二个集合更复杂,包含了第一个集合中列出的每个_id
的信息(在第二个集合中称为frequency_collection_id
),但是frequency_collection_id
可能在每个记录的两个列表(info.details_one
和info.details_two
)中:
[
{
"_id" : ObjectId("53cfc1d086763c43723abb07"),
"info" : {
"status" : "pass",
"details_one" : [
{
"frequency_collection_id" : "A1",
"name" : "A1_object_name",
"class" : "known"
},
{
"frequency_collection_id" : "A2",
"name" : "A2_object_name",
"class" : "unknown"
}
],
"details_two" : [
{
"frequency_collection_id" : "A1",
"name" : "A1_object_name",
"class" : "known"
},
{
"frequency_collection_id" : "A2",
"name" : "A2_object_name",
"class" : "unknown"
}
],
}
}
...
]
我要做的是将频率信息(来自第一个集合)合并到第二个集合中,实际上创建了一个集合,看起来像:
[
{
"_id" : ObjectId("53cfc1d086763c43723abb07"),
"info" : {
"status" : "pass",
"details_one" : [
{
"frequency_collection_id" : "A1",
"name" : "A1_object_name",
"class" : "known",
**"value" : 19**
},
{
"frequency_collection_id" : "A2",
"name" : "A2_object_name",
"class" : "unknown",
**"value" : 6**
}
],
"details_two" : [
{
"frequency_collection_id" : "A1",
"name" : "A1_object_name",
"class" : "known",
**"value" : 19**
},
{
"frequency_collection_id" : "A2",
"name" : "A2_object_name",
"class" : "unknown",
**"value" : 6**
}
],
}
}
...
]
我知道这应该是可能的MongoDB的MapReduce
函数,但我所看到的所有的例子都是要么太小我的集合结构,或者是回答不同的问题比我正在寻找。
有人有什么建议吗?我如何将我的频率信息(从我的第一个集合)合并到记录中(在我的第二个集合的每个记录中的两个列表中)?
我知道这或多或少是JOIN
, MongoDB
不支持,但从我的阅读,它看起来像是MapReduce
的一个主要例子。
就像所有的MongoDB操作一样,MapReduce总是只操作一个集合,不能从另一个集合获取信息。因此,第一步需要将两个集合转储为一个集合。你的文档有不同的_id,所以它们共存在同一个集合中应该不是问题。
然后你做一个MapReduce,其中map函数emit
为它们共同的key
(即它们的频率ID)存储这两种文档。
reduce函数将为每个键接收一个包含两个文档的数组:您收到的两个文档。然后,您只需将这两个文档合并为一个即可。请记住,reduce-函数可以以任何顺序接收这两个文档。也可能会因为部分结果(仅两个文档中的一个)或已经完成的结果调用它。您需要优雅地处理这些情况!一个好的实现可以是创建一个新对象,然后迭代输入文档,将所有现有的相关字段及其值复制到新对象中,因此结果对象是输入文档的合并。