MongoDB MapReduce发出奇怪的声音

时间:2012-02-17 21:21:37

标签: mongodb mapreduce

对于MapReduce而言,我是一个非常棒的人,我一直在解决这个问题。希望有人可以帮我一臂之力。

我的目标:获取产品收入和销售单位数。

交易收集示例文档我在哪里查询:

 { "_id" : ObjectId( "xxxxxxxxxx" ),
  "MerchantID" : { "$ref" : "merchants",
    "$id" : ObjectId( "xxxxxxxx" ) },
  "TransactionSocialKey" : "xxxxxxxx",
  "PurchaseComplete: true,
  "Products" : [ 
    { "ProductID" : { "$ref" : "products",
        "$id" : ObjectId( "4ecae2b9cf72ab1f6900xxx1" ) },
      "ProductPrice" : 14.99,
      "ProductQuantity" : "1" }, 
    { "ProductID" : { "$ref" : "products",
        "$id" : ObjectId( "4ecae2b9cf72ab1f690xxx2" ) },
      "ProductPrice" : 14.99,
      "ProductQuantity" : "1" } ],
  "DateTimeCreated" : Date( 1321919161000 ) }

如您所见,我有一个名为Products的嵌入式阵列,其中包含ProductID,产品价格和产品数量。

我的地图功能

map = function(){

  if(this.PurchaseComplete === true){

        this.Products.forEach(function(Product){

            if(Product.ProductID.$id.toString() == Product_ID.toString()){

                emit(Product_ID, {
                    "ProductQuantity" : Product.ProductQuantity, 
                    "ProductPrice" : Product.ProductPrice,
                    "ProductID" : Product.ProductID.$id.toString()
                }); 

            }

        }); 
    }
}

因此,我只会发出已完成的交易。如果事务已完成,我循环遍历Products数组,如果Product.ProductID。$ id等于我在MapReduce Scope中设置的Product_ID,那么我将从集合中发出Product。

为了测试,我将Reduce功能设置为:

reduce = function(key, Product_Transactions){

    return {"Transactions" : Product_Transactions}; 

}

由于一些奇怪的原因,我得到了这样的结果:

[results] => Array
        (
            [0] => Array
                (
                    [_id] => MongoId Object
                        (
                            [$id] => 4ecae2b9cf72ab1f6900xxx1
                        )

                    [value] => Array
                        (
                            [Transactions] => Array
                                (
                                    [0] => Array
                                        (
                                            [Transactions] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [ProductQuantity] => 1
                                                            [ProductPrice] => 14.99
                                                            [ProductID] => 4ecae2b9cf72ab1f6900xxx1
                                                        )

                                                    [1] => Array
                                                        (
                                                            [ProductQuantity] => 1
                                                            [ProductPrice] => 14.99
                                                            [ProductID] => 4ecae2b9cf72ab1f6900xxx1
                                                        )

                                                       It Continues… 
                                                 )
                                         )
                                   [1] => Array
                                        (
                                            [ProductQuantity] => 1
                                            [ProductPrice] => 12.74
                                            [ProductID] => 4ecae2b9cf72ab1f6900xxx1
                                        )

                                    [2] => Array
                                        (
                                            [ProductQuantity] => 1
                                            [ProductPrice] => 12.74
                                            [ProductID] => 4ecae2b9cf72ab1f6900xxx1
                                        )

                            )
                       )
                   )
             )

我不知道为什么我会得到这个奇怪的嵌入式阵列。 emit键始终相同且永不改变。我真的迷失在哪里开始解决问题的想法。任何帮助或指导将不胜感激。

1 个答案:

答案 0 :(得分:1)

map的输出应与reduce消耗和生成的格式相同。我们的想法是reduce可以并行运行和/或部分减少结果。

以下是代码的外观(伪代码)

var map = function() {
  if(some condition) {
    emit(product_id, {Transactions: [{ // <= note the array here!
                        "ProductQuantity" : Product.ProductQuantity, 
                        "ProductPrice" : Product.ProductPrice,
                        "ProductID" : ID
                    }]})
  }
};

var reduce = function(key, vals) {
  var result = {Transactions: []};

  vals.forEach(function(v) {
    v.Transactions.forEach(t) {
      result.Transactions.push(t);
    }
  });

  return result;
}