簡體   English   中英

MongoDB MapReduce發射怪異

[英]MongoDB MapReduce Emit Strangeness

對於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,Product Price和Product Quantity。

我的地圖功能

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范圍中設置的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
                                        )

                            )
                       )
                   )
             )

我不確定為什么要得到這個奇怪的嵌入式陣列。 發射鍵始終相同,永不改變。 我真的迷失了從哪里開始排障的想法。 任何幫助或指導,將不勝感激。

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM