使用MapReduce / Aggregation创建搜索构面

时间:2013-03-22 16:47:39

标签: mongodb mapreduce pymongo

我有以下原型的文件:

{
   title: "HD8200 DLP Projector",
   normal_price: 4999.99,
   specifications: [
       {
           ov: "HD (1920 x 1080)",
           fn: "Resolution (Native / Max)",
           o: 7,
           f: 211
       },
       {
           ov: "20000",
           fn: "Contrast Ratio",
           o: 15,
           f: 225
       }
   ]
}

我希望根据规格为此产品数据库创建过滤器列表。

如何为每个字段(o)获取映射到其产品计数器的选项ID列表(f)?

我们假设我需要为特定的字段ID列表(例如,211和225)实现此目的。

1 个答案:

答案 0 :(得分:0)

编写一个映射器,为每个map()调用获取一个文档,并为每个选项写出一条记录。记录密钥是字段ID,值是标志“1”,产品标题和选项ID的串联。

编写另一个映射器来读取id的列表并写出具有相同格式的记录:键是字段ID,值是标志“0”和两个空字符串的串联。

编写Reducer以读入两个映射器写入的记录。每次调用reducer()都会传入为给定字段编写的所有记录。如果其中一个记录的标记为“0”,那么该字段就是您感兴趣的字段之一。只有这样,您才会为每个记录写一个带有“1”标记的记录。关键是产品标题,值是选项ID。

定义您的第一个作业驱动程序类以使用两个映射器和一个reducer。此步骤将为您指定的字段ID提供成对的产品选项。您需要第二份工作来按产品收集选项,反之亦然。