MongoDB将两个数组内的值相乘

时间:2018-09-11 11:24:56

标签: mongodb mongodb-query aggregation-framework

我需要将对象数组中的值相乘以获得输出的帮助。

这是我的JSON

$tags = array();
foreach ( get_tags() as $before_tag ) {
    $tags[] = $before_tag->name;
}
if ( isset( $_REQUEST['tags'] ) && $_REQUEST['tags'] != '' && $_REQUEST['tags'] != null ) {
    $filter_tags = explode( ',', $_REQUEST['tags'] );
} else {
    $filter_tags = $tags;
}
$args =
    array(
        'tag'         => $filter_tags,
    );
$posts_by_tags = get_posts( $args );
$each_sixth    = 1;
foreach ( $posts_by_tags as $post_by_tags ){
    // do stuff
    echo get_the_title( $post_by_tags->ID );
}

我需要做的是将值/* 1 */ { "_id" : ObjectId("5b919a785cb288f7d5311846"), "nome" : "Antonio", "cod_produtor" : "PR001", "morada" : { "rua" : "Rua dos Carvalhos", "n_porta" : 12.0, "cod_postal" : "4567-123" }, "data-registo" : ISODate("2017-07-22T03:41:20.201+0000"), "colheita" : { "cod_colheita" : "COL001", "ano" : 2018.0, "tipo_maça" : "Ambrosia", "precario" : [ { "valor" : "0-60", "preço" : 0.1 }, { "valor" : "60-65", "preço" : 0.12 }, { "valor" : "65-70", "preço" : 0.15 }, { "valor" : "70-75", "preço" : 0.17 }, { "valor" : "75-80", "preço" : 0.2 }, { "valor" : "80+", "preço" : 0.23 }, { "valor" : "85-90", "preço" : 0.25 }, { "valor" : "90+", "preço" : 0.3 }, { "valor" : "DEFEITO", "preço" : 0.05 } ], "Lote" : { "Número Lote" : "FE9450H", "Peso" : 4495.0, "calibragem" : [ { "valor" : "0-60", "quantidade" : 22.0 }, { "valor" : "60-65", "quantidade" : 224.0 }, { "valor" : "65-70", "quantidade" : 624.0 }, { "valor" : "70-75", "quantidade" : 1183.0 }, { "valor" : "75-80", "quantidade" : 1424.0 }, { "valor" : "80+", "quantidade" : 911.0 }, { "valor" : "85-90", "quantidade" : 45.0 }, { "valor" : "90+", "quantidade" : 6.0 }, { "valor" : "DEFEITO", "quantidade" : 54.0 } ], "TOTAL" : 4493.0, "DIFERENÇA" : -2.0 } } } /* 2 */ { "_id" : ObjectId("5b91a8f65cb288f7d5311b50"), "nome" : "João", "cod_produtor" : "PR002", "morada" : { "rua" : "Rua dos Travessas", "n_porta" : 169.0, "cod_postal" : "9871-456" }, "data-registo" : ISODate("2016-12-24T08:43:20.201+0000"), "colheita" : { "cod_colheita" : "COL005", "ano" : 2018.0, "tipo_maça" : "Golden", "precario" : [ { "valor" : "0-60", "preço" : 0.1 }, { "valor" : "60-65", "preço" : 0.12 }, { "valor" : "65-70", "preço" : 0.15 }, { "valor" : "70-75", "preço" : 0.17 }, { "valor" : "75-80", "preço" : 0.2 }, { "valor" : "80+", "preço" : 0.23 }, { "valor" : "85-90", "preço" : 0.25 }, { "valor" : "90+", "preço" : 0.3 }, { "valor" : "DEFEITO", "preço" : 0.05 } ], "Lote" : { "Número Lote" : "FE1283961", "Peso" : 1234.0, "calibragem" : [ { "valor" : "0-60", "quantidade" : 22.0 }, { "valor" : "60-65", "quantidade" : 101.0 }, { "valor" : "65-70", "quantidade" : 223.0 }, { "valor" : "70-75", "quantidade" : 183.0 }, { "valor" : "75-80", "quantidade" : 424.0 }, { "valor" : "80+", "quantidade" : 11.0 }, { "valor" : "85-90", "quantidade" : 5.0 }, { "valor" : "90+", "quantidade" : 6.0 }, { "valor" : "DEFEITO", "quantidade" : 54.0 } ], "TOTAL" : 1029.0, "DIFERENÇA" : 205.0 } } } /* 3 */ { "_id" : ObjectId("5b91a9855cb288f7d5311b72"), "nome" : "Antonio", "cod_produtor" : "PR001", "morada" : { "rua" : "Rua dos Carvalhos", "n_porta" : 12.0, "cod_postal" : "4567-123" }, "data-registo" : ISODate("2017-07-22T03:41:20.201+0000"), "colheita" : { "cod_colheita" : "COL001", "ano" : 2017.0, "tipo_maça" : "Ambrosia", "precario" : [ { "valor" : "0-60", "preço" : 0.1 }, { "valor" : "60-65", "preço" : 0.12 }, { "valor" : "65-70", "preço" : 0.15 }, { "valor" : "70-75", "preço" : 0.17 }, { "valor" : "75-80", "preço" : 0.2 }, { "valor" : "80+", "preço" : 0.23 }, { "valor" : "85-90", "preço" : 0.25 }, { "valor" : "90+", "preço" : 0.3 }, { "valor" : "DEFEITO", "preço" : 0.05 } ], "Lote" : { "Número Lote" : "FE9450H", "Peso" : 1000.0, "calibragem" : [ { "valor" : "0-60", "quantidade" : 50.0 }, { "valor" : "60-65", "quantidade" : 150.0 }, { "valor" : "65-70", "quantidade" : 200.0 }, { "valor" : "70-75", "quantidade" : 250.0 }, { "valor" : "75-80", "quantidade" : 150.0 }, { "valor" : "80+", "quantidade" : 100.0 }, { "valor" : "85-90", "quantidade" : 45.0 }, { "valor" : "90+", "quantidade" : 15.0 }, { "valor" : "DEFEITO", "quantidade" : 40.0 } ], "TOTAL" : 1000.0, "DIFERENÇA" : 0.0 } } } /* 4 */ { "_id" : ObjectId("5b91ab8c5cb288f7d5311bed"), "nome" : "Antonio", "cod_produtor" : "PR001", "morada" : { "rua" : "Rua dos Carvalhos", "n_porta" : 12.0, "cod_postal" : "4567-123" }, "data-registo" : ISODate("2017-07-22T03:41:20.201+0000"), "colheita" : { "cod_colheita" : "COL001", "ano" : 2017.0, "tipo_maça" : "Ambrosia", "precario" : [ { "valor" : "0-60", "preço" : 0.1 }, { "valor" : "60-65", "preço" : 0.12 }, { "valor" : "65-70", "preço" : 0.15 }, { "valor" : "70-75", "preço" : 0.17 }, { "valor" : "75-80", "preço" : 0.2 }, { "valor" : "80+", "preço" : 0.23 }, { "valor" : "85-90", "preço" : 0.25 }, { "valor" : "90+", "preço" : 0.3 }, { "valor" : "DEFEITO", "preço" : 0.05 } ], "Lote" : { "Número Lote" : "FE9450H", "calibragem" : [ { "valor" : "0-60", "quantidade" : 50.0 }, { "valor" : "60-65", "quantidade" : 150.0 }, { "valor" : "65-70", "quantidade" : 200.0 }, { "valor" : "70-75", "quantidade" : 250.0 }, { "valor" : "75-80", "quantidade" : 150.0 }, { "valor" : "80+", "quantidade" : 100.0 }, { "valor" : "85-90", "quantidade" : 45.0 }, { "valor" : "90+", "quantidade" : 15.0 }, { "valor" : "DEFEITO", "quantidade" : 40.0 } ], "TOTAL" : 1000.0, "DIFERENÇA" : 0.0 } } } colheita.precario相乘得到它们的总和。在colheita.Lote.calibragem中,您拥有colheita.precariovalor;在preço中,您拥有colheita.Lote.calibragemvalor。字段quantidade必须匹配,然后乘以valor * preço

实际上,我有两种不同的方法。但是他们都不在工作。 我在想这样的事情:

使用STUDIO 3T

第一阶段-匹配

在这里我需要匹配不同的东西

quantidade

第2阶段-项目

{
    "cod_produtor" : "PR001", 
    "colheita.ano" : 2017
}

但是这不起作用,因为它给出了一个错误:

  

{ // specifications _id : "$colheita.Lote.Número Lote", total: { $sum:[ { "$multiply": [ "$colheita.precario.0.preço", "$colheita.Lote.0.quantidade" ] }, { "$multiply" : [ "$colheita.precario.1.preço", "$colheita.Lote.1.quantidade" ] } ] } } 累加器是一元运算符”

非常感谢您的帮助

2 个答案:

答案 0 :(得分:1)

您可以在3.4聚合中使用以下项目。

$range遍历$map内的colheita.precario,并输出包含数组字段的值,这些数组字段包含preco和quanidade的乘积。

$let带有索引(来自{{11}}(ix)的表达式),以输出colheita.precario和Lote.calibragem元素。

$project$sum一起输出数组值的总和。

$range

答案 1 :(得分:1)

  

您可以使用以下汇总

db.state.aggregate(

// Pipeline
[
    // Stage 1
    {
        $unwind: {
            path : "$colheita.precario",
            includeArrayIndex : "arrayIndex", // optional
            preserveNullAndEmptyArrays : false // optional
        }
    },

    // Stage 2
    {
        $unwind: {
            path : "$colheita.Lote.calibragem",
            includeArrayIndex : "arrayIndex", // optional
            preserveNullAndEmptyArrays : false // optional
        }
    },

    // Stage 3
    {
        $project: {
             "total": {
                    "$cond": { 
                        "if": { "$eq": [ "$colheita.precario.valor", "$colheita.Lote.calibragem.valor" ] }, 
                        "then": { $multiply: [ "$colheita.precario.preço", "$colheita.Lote.calibragem.quantidade" ] },
                        "else": 0
                    }
             }
        }
    },

    // Stage 4
    {
        $group: {
            "_id":"$_id",
            totalAmount: { $sum: "$total" }
        }
    },
]);