【问题标题】:select from union select with order by and group by in mongodb using aggregation在mongodb中使用聚合从union中选择order by和group by
【发布时间】:2017-06-23 21:15:51
【问题描述】:

我尝试使用 C# 聚合框架将下一个 SQL 查询重写为 mongodb,但我不明白该怎么做。我需要联合一些结果。

SELECT TOP 100 RES.Agent, RES.Type, RES.Opens FROM ((SELECT UA.ClientDomain AS Agent, UA.Type AS Type, COUNT(*) AS Opens 
                                                    FROM tReadConfirm AS RC INNER JOIN tUserAgent AS UA ON RC.UserAgentId = UA.Id
                                                    WHERE RC.UserId = 2654 AND RC.CampaignId = 27442  AND UA.Type = 1
                                                    GROUP BY UA.ClientDomain, UA.Type)
                                                UNION
                                                (SELECT UA.Family AS Agent, UA.Type AS Type, COUNT(*) AS Opens 
                                                    FROM tReadConfirm AS RC INNER JOIN tUserAgent AS UA ON RC.UserAgentId = UA.Id
                                                    WHERE RC.UserId = 2654 AND RC.CampaignId = 27442 AND UA.Type <> 1
                                                    GROUP BY UA.Family, UA.Type)) AS RES
                                                ORDER BY RES.Opens DESC

这是我的起始代码,但它不能满足我的需要

db.analytics.aggregate(
    {
        $match: { UserId: 4749, CampaignId: 93178}
    },
    {
        $group :
        {
            _id : 
            { 
                "Family" : "$userAgent.Family",
                "Type" : "$userAgent.Type",
                "ClientDomain" : "$userAgent.ClientDomain",
            }  ,
            "Opens": 
            {
                 $sum : 1 
            }
         }
     },
     {$sort :{"Opens":-1}}
)

【问题讨论】:

    标签: c# mongodb aggregation-framework mongodb-.net-driver


    【解决方案1】:

    我找到了答案,这是我的工作代码示例。运算符“$cond”对我有帮助。

    db.analytics.aggregate(
    
        { 
            $match : { 
                "UserId" : 4790, 
                "CampaignId" : 93178} 
         },
         {
            $group :
            {
                _id : 
                { 
                    "Type" : "$userAgent.Type",
                    "ClientDomain" : { $cond: { if: { $eq: [ "$userAgent.Type", 1 ] }, then: "$userAgent.ClientDomain", else: "$userAgent.Family" }},
                }  ,
                "Opens": 
                {
                     $sum : 1 
                }
             }
         },
         {
             $sort :{"Opens":-1}
         },
         {
             $limit:10
         }
    )
    

    【讨论】:

      【解决方案2】:

      你可以试试下面的思路:

      1. 过滤公共部分 - 你已经在 $match 阶段完成了
      2. 通过 $project 操作符获取新的文档结构。像

        {代理: [{Agent:“$userAgent.Family”,索引:0},{Agent:“$userAgent.ClientDomain”,索引:1}],类型:“$userAgent.Type”}

      3. $unwind 代理字段,因此您得到 2 个文档,而不是 1 个具有 2 个元素数组的文档。

      4. 用下面的思路再次过滤:{$or: [{Index: 0, Type:1}, {Index:1, Type1}]}

      5. 按代理、类型和索引字段分组。

      如果我没记错的话,你会得到同样的结果。

      编辑:不幸的是,第 2 步不起作用。 MongoDB: how create a new array field with the aggregate framework

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-28
        相关资源
        最近更新 更多