MongoDB -我如何使用MapReduce将一个集合的值合并到另一个集合上的第二个集合的多个键



我有两个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_oneinfo.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-函数可以以任何顺序接收这两个文档。也可能会因为部分结果(仅两个文档中的一个)或已经完成的结果调用它。您需要优雅地处理这些情况!一个好的实现可以是创建一个新对象,然后迭代输入文档,将所有现有的相关字段及其值复制到新对象中,因此结果对象是输入文档的合并。

相关内容

  • 没有找到相关文章

最新更新