JSON路径父对象,或等效的MongoDB查询

时间:2013-06-04 04:17:52

标签: json mongodb pentaho

我在JSON输入中选择节点但是找不到为我查询的每个数组条目包含父对象详细信息的方法。我使用pentaho数据集成来使用JONG输入从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。有些产品有一种尺寸 - 包装。其他有多种尺寸--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 '{}';

1 个答案:

答案 0 :(得分:2)

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

首先,您需要一个获取SKU,Name和size_break_costs数组的JSON输入步骤,所有这些都是字符串。重要的是size_break_costs是一个String,基本上只是一个字符串化的JSON数组。确保在JSON输入的“内容”选项卡下,选中“忽略丢失的路径”,以防您获得一个空数组或由于某种原因缺少该字段。

对于您的字段,请使用:

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

在此步骤之后,我添加了一个“Filter rows”块,条件为“SizeBreakCosts IS NOT NULL”,然后传递给第二个JSON Input块。第二个JSON块,您需要检查“源是否在字段中定义?”,并将“从源字段获取源”的值设置为“SizeBreakCosts”,或者在第一个JSON输入块中将其命名为“。 / p>

再次确保选中“忽略丢失的路径”,以及“忽略空文件”。从这个块开始,我们想得到两个字段。我们已经传入了每一行的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