2014-10-27 37 views
0

如何引用MongoDB中的對象數組中的對象的每個屬性MapReduce JavaScript查詢?如何引用MongoDB中的對象數組中的對象的每個屬性MapReduce JavaScript查詢?

這裏是我的數據:

{ 
    "_id": ObjectId("544ae3de7a6025f0470041a7"), 
    "name": "Bundle 4", 
    "product_groups": [ 
    { 
     "name": "camera group", 
     "products": [ 
     { 
      "$ref": "products", 
      "$id": ObjectId("531a2fcd26718dbd3200002a"), 
      "$db": "thisDB" 
     }, 
     { 
      "$ref": "products", 
      "$id": ObjectId("538baf7c26718d0a55000043"), 
      "$db": "thisDB" 
     }, 
     { 
      "$ref": "products", 
      "$id": ObjectId("538baf7c26718d0a55000045"), 
      "$db": "thisDB" 
     } 
     ] 
    }, 
    { 
     "name": "lens group", 
     "products": [ 
     { 
      "$ref": "products", 
      "$id": ObjectId("531e3ce926718d0d45000112"), 
      "$db": "thisDB" 
     }, 
     { 
      "$ref": "products", 
      "$id": ObjectId("531e3ce926718d0d45000113"), 
      "$db": "thisDB" 
     } 
     ] 
    } 
    ] 
} 

這裏是我的地圖功能:(爲簡單起見,我拿出了降低的選擇,因爲如果地圖不正確的工作也沒關係)

var map = function() { emit(this.product_groups, this.product_groups.products); }; 
db.instant_rebates.mapReduce(
    map, 
    { 
     out: "map_reduce_example", 
     query: {"_id": ObjectId("544ae3de7a6025f0470041a7")} 
    } 
); 

但問題是結果中的「值」字段總是以「未定義」的形式出現。爲什麼?爲什麼this.product_groups.products不會返回產品數組?我該如何解決?

此外,我想要做的是發出TWICE,一次爲每個兩個product_groups。但到目前爲止,它只能發射一次。我如何解決這個問題?

回答

1

在mapReduce操作下,文檔以JavaScript對象的形式呈現,因此您需要對它們進行處理並遍歷它們。這意味着處理所述陣列的每個成員:

var map = function() { 
    this.product_groups.forEach(function(group) { 
     emit(group.name, { products: group.products }); 
    }); 
}; 
var reduce = function(){}; 

db.instant_rebates.mapReduce(
    map, 
    reduce, 
    { 
     out: "map_reduce_example", 
     query: {"_id": ObjectId("544ae3de7a6025f0470041a7")} 
    } 
); 

的「發射」的功能的要求,是既「密鑰」和「值」被呈現作爲發射參數。 「值」必須是單數,因此發出一個「數組」數據,您需要將其包裝在對象的屬性下。 「鍵」必須是單數值,因爲它意圖將其用作縮減操作中的「分組鍵」,並且至少例如「名稱」字段應該是足夠的。

當然,由於文檔中有一個頂級數組,因此可以像處理函數一樣處理「每個元素」,然後每個結果都會「發射」,因此從這個文檔發出「兩個」結果。

您還需要至少定義一個「減少」功能,即使它永遠不會被調用,因爲所有發出的按鍵都不同,就像這裏的情況一樣。

所以,它是JavaScript。將列表結構視爲列表。

請注意。這是你所有的問題。如果你想在mapReduce上提出進一步的問題,那麼請詢問其他問題。別再問這個了。我不想談論你的領域命名,或者詳細說明這似乎是在努力實現「我如何從其他集合中提取數據」,這是你不能做的事情。

相關問題