在 mongodb 中创建具有非聚合字段的视图而不将其放入 _id 字段

Creating a view with non aggregate field in mongodb without putting it in _id field

我有一个包含以下数据的集合

{
    "_id" : ObjectId("5fc8a58257f6526c6a520725"),
    "job_id" : ObjectId("5fc8a5822aed5820240c2893"),
    "access_id" : ObjectId("5eda0b2495b51c1d746db8b2"),
    "campaign_num" : "488707373",
    "partner_id" : ObjectId("5a94e02bb0445b1cc742d735"),
    "parent_partner" : ObjectId("5a8d70c4b0445b6a883fd395"),
    "status" : "A",
    "route" : "SR",
    "otp" : true,
    "trans" : false,
    "job_payload" : {
        "senderid" : "36",
        "msisdn" : "9671660999",
        "script" : "Your verification code is : 166297",
        "pingbackurl" : "https://xyztesting.com/sms/v1/notify/pr/index.php",
        "templateid" : "769",
        "smstype" : "2"
    },
    "track" : {
        "added" : {
            "date" : ISODate("2020-12-03T08:44:50.000Z")
        },
        "routed" : ISODate("2020-12-03T08:44:50.000Z")
    },
    "message_parts" : 1,
    "provider_status" : {
        "job_id" : "",
        "count" : {
            "total" : 1,
            "sent" : 0,
            "delivered" : 0,
            "failed" : 0
        },
        "delivery" : []
    }
}

我想计算所有的总数,发送、交付、失败,其中 campaign_num 和日期相同。即在同一日期使用相同的 campaign_num。 我使用以下查询创建了视图

var pipeline = [
   {
      $group: {
         _id: {
            campaign: "$campaign_num",
            date: { $dateToString: { format: "%Y-%d-%m", date: "$track.added.date" } }
         },
         total: { $sum: "$provider_status.count.total" },
         sent: { $sum: "$provider_status.count.sent" },
         delivered: { $sum: "$provider_status.count.delivered" },
         failed: { $sum: "$provider_status.count.failed" }
      }
   }
] 
db.createView("sms_daily_test","col_outbox",pipeline)

我得到如下所示的输出

 "_id" : {
        "campaign" : "488707373",
        "date" : "2021-19-01"
    },
    "total" : 3,
    "sent" : 3,
    "delivered" : 0,
    "failed" : 0
}

现在的主要问题是我还想包含 partner_id 和 access_id 字段,但不包含在 _id 中。即我希望输出是这样的

"_id" : {
            "campaign" : "488707373",
            "date" : "2021-19-01"
        },
        "total" : 3,
        "sent" : 3,
        "delivered" : 0,
        "failed" : 0,
        "partner_id":ObjectId("5a94e02bb0445b1cc742d735"),
        "access_id":ObjectId("5a94e02bb0445b1cc742d635")
    }

我正在使用下面的代码

var pipeline = [
   {
      $group: {
         _id: {
            campaign: "$campaign_num",
            date: { $dateToString: { format: "%Y-%d-%m", date: "$track.added.date" } }
         },
         partner_id: "$partner_id",
         access_id: "$access_id",
         total: { $sum: "$provider_status.count.total" },
         sent: { $sum: "$provider_status.count.sent" },
         delivered: { $sum: "$provider_status.count.delivered" },
         failed: { $sum: "$provider_status.count.failed" }
      }
   }
]   
db.createView("sms_daily_testing2","col_outbox",pipeline)

当我 运行 它时,我收到以下错误消息: The field 'partner_id' must be an accumulator object.

关于此字段的信息是,一个特定的活动将只有一个 partner_id 和一个 access_id。尽管 partner_id 可以有多个广告系列,而 access_id 也可以有多个广告系列。

我需要按我完成的活动和日期字段对数据进行分组。我只需要知道如何添加这两个字段而不将其放在 _id 字段中。

使用这个:

var pipeline = [
   {
      $group: {
         _id: {
            campaign: "$campaign_num",
            date: { $dateToString: { format: "%Y-%d-%m", date: "$track.added.date" } }
         },
         partner_id: { $push: "$partner_id" },
         access_id: { $push: "$access_id" },
         total: { $sum: "$provider_status.count.total" },
         sent: { $sum: "$provider_status.count.sent" },
         delivered: { $sum: "$provider_status.count.delivered" },
         failed: { $sum: "$provider_status.count.failed" }
      }
   }
]   

您也可以使用 $addToSet

而不是 $push

您写到给定的活动和日期将具有唯一的 partner_id 和 access_id。而且我们必须在 _id 字段之外使用累加器对象。由于我们只有一个合作伙伴并且 access_id 我们可以使用 $first 或 $last,如下所示:

 var pipeline=[{$group:{_id:{campaign:"$campaign_num",date:{$dateToString:{format:"%Y-%m-%d",date:"$track.added.date"}}},
        partner_id:{$first:"$partner_id"},
        access_id:{$first:"$access_id"},
        total: {$sum: "$provider_status.count.total"},
        sent:{$sum:"$provider_status.count.sent"},
        delivered:{$sum:"$provider_status.count.delivered"},
        failed:{$sum:"$provider_status.count.failed"}}
              }]