【问题标题】:JSON path parent object, or equivalent MongoDB queryJSON 路径父对象,或等效的 MongoDB 查询
【发布时间】:2013-05-30 08:54:37
【问题描述】:

我在 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 查询,它给出了 正确 结果,但相应的导出不起作用。没有返回 Size 和 Quantity 的值。

查询:

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

【问题讨论】:

    标签: json mongodb pentaho


    【解决方案1】:

    在我添加自己的赏金后不久,我就找到了解决方案。我的问题具有相同的基本结构,即父标识符,以及一些用于评级(质量、价值等)的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-17
      • 2022-01-11
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      相关资源
      最近更新 更多