MongoDB MapReduce Emit Strangeness - PullRequest
       5

MongoDB MapReduce Emit Strangeness

0 голосов
/ 18 февраля 2012

Я очень нуб, когда дело доходит до 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 равен Product_ID, который я установил в области действия MapReduce, я собираюсь выдать Product из набора.

Для тестирования я настроил свою функцию уменьшения как:

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 Ответ

1 голос
/ 18 февраля 2012

Вывод 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...