簡體   English   中英

我無法獲得匯總數據。 PHP + mongoDB

[英]I can not get data to aggregate It. PHP + mongoDB

它像我需要的那樣工作:

    $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);

但是我需要從同一文檔中的數組中獲取用於聚合的真實數據:版本[0] [內容] [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] [“ content”] [“ 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
}

好吧,您不能在聚合管道中進行此類投影。 如果要對聚合語句中的數組元素進行操作,則首先需要$unwind該數組,然后$match所需的元素,或者根據情況選擇使用額外的$group階段選擇$first項。

您的問題沒有顯示文檔的結構,因此我將僅使用一個示例作為“椅子”集合:

{
    "_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"} 
    }}

])

當然,如果您的實際文檔具有嵌套數組,那么您將“展開”並“匹配”所需的元素。 但這是將數組內容“縮小”到所需元素的一般過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM