2013-06-04 50 views
3

我在JSON輸入中選擇節點,但找不到包含我查詢的每個數組條目的父對象詳細信息的方法。我正在使用pentaho數據集成從MongoDB輸入中使用JSON輸入查詢數據。JSON路徑父對象或等效的MongoDB查詢

我也嘗試創建一個mongodb查詢來實現相同,但似乎無法做到這一點。

下面是兩種場/時顯示的數據路徑:

$ .size_break_costs [*]大小 $ .size_break_costs [*]量

這裏是JSON源格式:

{ 
"_id" : ObjectId("4f1f74ecde074f383a00000f"), 
"colour" : "RAVEN-SMOKE", 
"name" : "Authority", 
"size_break_costs" : [ 
    { 
     "quantity" : NumberLong("80"), 
     "_id" : ObjectId("518ffc0697eee36ff3000002"), 
     "size" : "S" 
    }, 
    { 
     "quantity" : NumberLong("14"), 
     "_id" : ObjectId("518ffc0697eee36ff3000003"), 
     "size" : "M" 
    }, 
    { 
     "quantity" : NumberLong("55"), 
     "_id" : ObjectId("518ffc0697eee36ff3000004"), 
     "size" : "L" 
    } 
], 
"sku" : "SK3579" 
} 

我目前得到如下結果:

S,80 
    M,14 
    L,55 

我想獲得的SKU和名稱,以及我的源將有多個產品(SKU /說明):

SK3579,Authority,S,80 
    SK3579,Authority,M,14 
    SK3579,Authority,L,55 

,當我嘗試使用$ .sku包括,我的過程中的錯誤。

我追求的最終結果是所有產品的報告和各種尺寸的可用數量。可能有一個替代的mongodb查詢提供了這個。

編輯:

看來問題可能是由於這樣的事實,並非所有行具有相同的結構。例如,以上包含3種尺寸 - S,M,L。部分產品採用同一尺寸 - PACK。其他進來多種尺寸 - 28,30,32,33,34,36,38等

產生的錯誤是:

*的數據結構是不是資源中的一樣!我們爲json路徑[$ .sku]找到了1個值,這是不同於路徑[$ .size_break_costs [] .quantity](7個值)減退的數字的值。對於所有路徑,我們必須具有相同數量的值。

我已經試過單獨以下的MongoDB查詢這給正確的結果,但這種對應的出口不工作。尺寸和數量不會返回任何值。

查詢:

db.product_details.find({}, {sku: true, "size_break_costs.size": true, "size_break_costs.quantity": true}).pretty(); 

出口:

mongoexport --db brandscope_production --collection product_details --csv --out Test01.csv --fields sku,"size_break_costs.size","size_break_costs.quantity" --query '{}'; 
+0

當您嘗試使用'$ .sku'包括?請將示例查詢(並在此處放置一條便條以通知我)。 – vinipsmaker

+0

嗨@vinipsmaker感謝回覆 - 我已更新原始問題以提供信息。 – Hec

+0

我已經讀過你的問題了(更新後的信息)。我不知道答案。我建議[設置賞金](http://stackoverflow.com/privileges/set-bounties),但你沒有足夠的分數。試試[MongoDB郵件列表](https://groups.google.com/forum/?fromgroups#!forum/mongodb-user)或[IRC頻道](irc://irc.freenode.net/#mongodb)。 – vinipsmaker

回答

2

後不久,我加了我自己的恩惠,我想出瞭解決方案。我的問題具有相同的基本結構,它是父級標識符,以及用於評級(質量,價值等)的N個子鍵/值對。

首先,您需要一個JSON輸入步驟,將SKU,Name和size_break_costs數組全部作爲字符串獲取。重要的一點是,size_break_costs是一個字符串,基本上只是一個字符串化的JSON數組。請確保在JSON輸入的內容選項卡下,選中「忽略缺少的路徑」,以防您得到一個空數組或缺少某個原因的字段。

爲了您的字段,可使用:

Name   | Path    | Type 
ProductSKU  | $.sku    | String 
ProductName | $.name    | String 
SizeBreakCosts | $.size_break_costs | String 

我這個步驟之後,增加了一個「過濾器行」塊,與條件「SizeBreakCosts IS NOT NULL」,然後將其傳遞給第二JSON輸入塊。這第二個JSON塊,您需要檢查「源在字段中定義?」,並將「從源字段獲取源」的值設置爲「SizeBreakCosts」,或者在第一個JSON輸入塊中將其命名爲「SizeBreakCosts」。

再次確保選中「忽略缺少路徑」以及「忽略空文件」。從這個區塊,我們會想要得到兩個字段。我們已經將ProductSKU和ProductName與傳入的每一行相關聯,並且此第二個JSON輸入步驟將進一步將其分割成多行,但SizeBreakCosts輸入JSON中有很多行。對於字段,可使用:

Name  | Path   | Type 
Quantity | $.[*].quantity | Integer 
Size  | $.[*].size  | String 

正如你所看到的,這些路徑使用,因爲我們傳遞的JSON字符串有一個數組作爲根項目,所以我們得到的「$ [*]字段名。」該數組中的每個項目,並解析其數量和大小。

現在每行都應該有父對象的SKU和名稱,以及每個子對象的數量和大小。傾倒這個例子到一個文本文件,我得到:

ProductSKU;ProductName;Size;Quantity 
SK3579;Authority;S; 80 
SK3579;Authority;M; 14 
SK3579;Authority;L; 55 
+0

這就是我現在面臨的問題,它給出瞭解決方案。非常感謝你! – Dino