我有两个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
的一个主要示例。
我正在尽我所能地学习蒙戈,所以如果我的问题太天真,请原谅我。
发布于 2014-07-24 07:02:48
就像所有的MongoDB操作一样,MapReduce总是只在一个集合上运行,不能从另一个集合中获取信息。因此,第一步需要将两个集合转储到一个集合中。您的文档有不同的_id,因此它们在同一个集合中共存不应该是一个问题。
然后执行一个MapReduce,其中映射函数emit
为它们的公共key
提供两种文档,这是它们的频率ID。
然后,您的reduce函数将为每个键接收一个由两个文档组成的数组:您已经收到的两个文档。然后,您只需将这两个文档合并为一个。请记住,减缩函数可以以任何顺序接收这两个文档。也可能发生调用部分结果(两个文档中只有一个)或已经完成的结果的情况。你需要优雅地处理这些案件!一个很好的实现可以是创建一个新的对象,然后迭代输入文档,将所有现有的相关字段及其值复制到新对象,因此产生的对象是输入文档的合并。
https://stackoverflow.com/questions/24936272
复制