3

我在 JSON 输入中选择节点,但找不到为我正在查询的每个数组条目包含父对象详细信息的方法。我正在使用 pentaho 数据集成来使用 JSON 输入从 mongodb 输入查询数据。

我也尝试创建一个 mongodb 查询来实现相同的目的,但似乎也无法做到这一点。

以下是显示数据的两个字段/路径:

$.size_break_costs[*].size $.size_break_costs[*].quantity

这是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 '{}';
4

1 回答 1

2

在我添加自己的赏金后不久,我找到了解决方案。我的问题具有相同的基本结构,即父标识符和用于评级(质量、价值等)的 N 个子键/值对。

首先,您需要一个 JSON 输入步骤,该步骤将 SKU、名称和 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 块,您需要检查“Source is defined in a field?”,并将“Get source from field”的值设置为“SizeBreakCosts”,或者您在第一个 JSON Input 块中命名的任何值。

同样,确保选中“忽略丢失的路径”以及“忽略空文件”。从这个块中,我们想要得到两个字段。我们已经有了 ProductSKU 和 ProductName 以及传入的每一行,第二个 JSON 输入步骤将进一步将其拆分为 SizeBreakCosts 输入 JSON 中的许多行。对于字段,请使用:

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

如您所见,这些路径使用“$.[*].FieldName”,因为我们传入的 JSON 字符串有一个数组作为根项,因此我们获取该数组中的每个项,并解析出它的数量和尺寸。

现在每一行都应该有父对象的 SKU 和名称,以及每个子对象的数量和大小。将此示例转储到文本文件中,我得到:

ProductSKU;ProductName;Size;Quantity
SK3579;Authority;S; 80
SK3579;Authority;M; 14
SK3579;Authority;L; 55
于 2013-09-16T18:00:05.927 回答