MongoDB聚合字段存在

时间:2016-05-30 17:05:49

标签: mongodb mongodb-query

我需要使用以下集合的架构执行求和:

{
    "_id" : "20160530/108107/31",
    "metadata" : {
        "date" : "2016-05-30",
        "offer" : "108107",
        "adv" : 31,
        "update" : ISODate("2016-05-30T15:27:20.240Z")
    },
    "daily_unique" : 4,
    "daily_gross" : 4,
    "hourly" : {
        "17" : {
            "unique" : 4,
            "gross" : 4
        }
    },
    "publisher" : {
        "738" : {
            "daily_unique" : 3,
            "daily_gross" : 3,
            "hourly" : {
                "17" : {
                    "unique" : 3,
                    "gross" : 3
                }
            }
        },
        "43" : {
            "daily_unique" : 1,
            "daily_gross" : 1,
            "hourly" : {
                "17" : {
                    "unique" : 1,
                    "gross" : 1
                }
            }
        }
    }
},
{
    "_id" : "20160530/78220/59",
    "metadata" : {
        "date" : "2016-05-30",
        "offer" : "78220",
        "adv" : 59,
        "update" : ISODate("2016-05-30T15:24:49.900Z")
    },
    "daily_unique" : 2,
    "daily_gross" : 2,
    "hourly" : {
        "17" : {
            "unique" : 2,
            "gross" : 2)
        }
    },
    "publisher" : {
        "43" : {
            "daily_unique" : 2,
            "daily_gross" : 2,
            "hourly" : {
                "17" : {
                    "unique" : 2,
                    "gross" : 2
                }
            }
        }
    }
}

第一个文档包含来自发布者738和43的数据,但第二个文档仅包含来自43的数据。 因此,当我想要总结来自发布者738的所有数据时,我需要将所有daily_gross或daily_unique相加,只有它出现在发布者中时,如第一个文档中那样。

我正在尝试一些不同的方法,使用$ exists和$ cond,但没有得到结果

aggregate(
    ['$match' => ['metadata.date' => date('Y-m-d')]],
    ['$group' => [
        '_id' => '$metadata.offer',
        'daily_u' => ['$sum' => '$daily_unique']
        ],
])

给了我

[
    0 => [
        '_id' => '108107'
        'daily_u' => 4
    ]
    1 => [
        '_id' => '78220'
        'daily_u' => 2
    ]
]

当我尝试深入了解出版商时,我无法得到我想要的结果:

aggregate(
    ['$match' => ['metadata.date' => date('Y-m-d')]],
    ['$group' => [
        '_id' => '$metadata.offer',
        'daily_u' => [
            '$sum' => [
                '$cond' => [
                    'if' => [
                        'publisher.738' => ['$exists' => true],
                        'then' => 1,
                        'else' => 0
                    ]
                ]   
            ]
        ],
    ]]
)

但是出版商无法每天获得。 当我尝试获取每小时数据时,它甚至变得复杂。 任何人都能指出我正确的方向吗? 提前谢谢。

0 个答案:

没有答案