我无法获取数据来聚合它。 PHP + mongoDB

时间:2014-04-03 14:21:34

标签: php mongodb aggregation-framework mongodb-php

它像我需要的那样工作:

    $out = $collection->aggregate(
        array(
            '$match' => array('type' => 'chair')
        ),
        array(
                '$project' => array(
                    'chairtype' => 1,
                    'mijczjeqeo'=>1
                )
        ),
        array( 
            '$group' => array(
                '_id' => '$chairtype', 
                'MIDDLE_mijczjeqeo' => array('$avg' => '$mijczjeqeo'),
                'SUMMA__mijczjeqeo' => array('$sum' => '$mijczjeqeo')
            )
        )
);
my_dump($out);

但是我需要在相同的文档中从数组中获取真正的聚合数据:versions [0] [content] [mijczjeqeo]

请更正我的脚本。它不起作用:

$out = $collection->aggregate(
        array(
            '$match' => array('type' => 'chair')
        ),
        array(
                '$project' => array(
                    'chairtype' => 1,
                    'versions.0.content.mijczjeqeo'=>1
                )
        ),
        array( 
            '$group' => array(
                '_id' => '$chairtype', 
                'MIDDLEmijczjeqeo' => array('$avg' => '$versions.0.content.mijczjeqeo'),
                'SUMMAmijczjeqeo' => array('$sum' => '$versions[0]["content"]["mijczjeqeo"]')
            )
        )
);

没有一种方法不起作用:

' MIDDLEmijczjeqeo' =>数组(' $ avg' =>' $ versions.0.content.mijczjeqeo')

' SUMMAmijczjeqeo' =>数组(' $ sum' =>' $ versions [0] ["内容"] [" mijczjeqeo"]')

我认为问题接近.0。

我尝试在mongo控制台中执行此操作...

db.documents.aggregate({$match:{'type':'chair'}},{$project:{'chairtype': 1, 'mijczjeqeo':1}},{$group:{'_id':'$chairtype','MID':{$avg:'$mijczjeqeo'}}})
{
    "result" : [
        {
            "_id" : "T",
            "MID" : 6.615384615384615
        },
        {
            "_id" : "G",
            "MID" : 8.310344827586206
        },
        {
            "_id" : "E",
            "MID" : 6.9523809523809526
        }
    ],
    "ok" : 1
}

db.documents.aggregate({$match:{'type':'chair'}},{$project:{'chairtype': 1, 'versions.0.content.mijczjeqeo':1}},{$group:{'_id':'$chairtype','MID':{$avg:'$versions.0.content.mijczjeqeo'}}})
{
    "result" : [
        {
            "_id" : "T",
            "MID" : 0
        },
        {
            "_id" : "G",
            "MID" : 0
        },
        {
            "_id" : "E",
            "MID" : 0
        }
    ],
    "ok" : 1
}

1 个答案:

答案 0 :(得分:0)

嗯,你不能在聚合管道中那样投射。如果要对聚合语句中的数组元素进行操作,首先需要$unwind数组,然后$match所需的元素,或者在您的情况下选择$first项使用额外的$group阶段。

您的问题没有显示文档的结构,所以我只是使用一个样本,作为我的"主席"系列:

{
    "_id": 1,
    "type": "chair",
    "chairtype": "A",
    "versions": [
        {
           "revision": 1,
           "content": {
               "name": "ABC",
               "value": 10
           }
        },
        {
           "revision": 2,
           "content": {
               "name": "BBB",
               "value": 15
           }
        }
    ]
}
{
    "_id": 2,
    "type": "chair",
    "chairtype": "A",
    "versions": [
        {
           "revision": 1,
           "content": {
               "name": "CCC",
               "value": 20
           }
        },
        {
           "revision": 2,
           "content": {
               "name": "BAB",
               "value": 12
           }
        }
    ]
}

最小,但足以说明问题。现在汇总声明:

db.chairs.aggregate([

    // Normal query matching, which is good
    { "$match": { "type": "chair" } },

    // Unwind the array to de-normalize
    { "$unwind": "$versions" },

    // Group by the document in order to get the "first" array element
    { "$group": { 
        "_id": "$_id", 
        "chairtype": { "$first": "$chairtype" }, 
        "versions": { "$first": "$versions" } 
    }},

    // Then group by "chairtype" to get your average values
    { "$group": { 
        "_id": "$chairtype", 
        "MID": {"$avg": "$versions.content.value"} 
    }}

])

当然,如果您的实际文档具有嵌套数组,那么您将"展开"和#34;匹配"必要的元素。但这是"缩小"的一般过程。数组内容到你需要的元素。