在 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"}}
}]
我有一个包含以下数据的集合
{
"_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"}}
}]