gpt4 book ai didi

mongodb - Mongo聚合,按2个不同数组中的相同字段分组

转载 作者:可可西里 更新时间:2023-11-01 09:55:37 27 4
gpt4 key购买 nike

我想使用以下数据集计算每个代理人每月赚取的总佣金:

db.comm.find()

/* 0 */
{
month: 1,
deals: [
{ agent: { _id: 1, name: 'Joe' }, deal: { _id: 1, comm: 10000 } },
{ agent: { _id: 1, name: 'Joe' }, deal: { _id: 2, comm: 13000 } },
{ agent: { _id: 2, name: 'Sue' }, deal: { _id: 3, comm: 20000 } }
],
referrals: [
{ agent: { _id: 1, name: 'Joe' }, referral_comm: 3000 },
{ agent: { _id: 3, name: 'Pete' }, referral_comm: 2500, other_comm: 1000 }
]
}

/* 1 */
{
month: 2,
deals: [
{ agent: { _id: 1, name: 'Joe' }, deal: { _id: 4, comm: 11000 } },
{ agent: { _id: 3, name: 'Pete' }, deal: { _id: 5, comm: 21000 } }
],
referrals: [
{ agent: { _id: 2, name: 'Sue' }, referral_comm: 2100, other_comm: 1100 },
{ agent: { _id: 4, name: 'Judy' }, referral_comm: 1100 }
]
}

我在以下管道中得到的结果不正确:

db.comm.aggregate([
{
$unwind: "$deals"
},
{
$project: {
month: 1,
agent: "$deals.agent",
comm: "$deals.deal.comm",
referrals: 1
}
},
{
$unwind: "$referrals"
},
{
$project: {
month: 1,
agent: 1,
comm: 1,
referral_comm: {
$add: [
"$referrals.referral_comm",
"$referrals.other_comm"
]
}
}
},
{
$project: {
month: 1,
agent: 1,
comm: {
$add: [ "$comm", "$referral_comm" ]
}
}
},
{
$group: {
_id: {
month: "$month",
agent: "$agent"
},
total: {
$sum: "$comm"
}
}
}
])

结果是:

/* 0 */
{
"result" : [
{
"_id" : {
"month" : 1,
"agent" : {
"_id" : 2,
"name" : "Sue"
}
},
"total" : 23500 //expected 20000
},
{
"_id" : {
"month" : 1,
"agent" : {
"_id" : 1,
"name" : "Joe"
}
},
"total" : 30000 //expected 26000
}, //missing Pete in Month 2
{
"_id" : {
"month" : 2,
"agent" : {
"_id" : 3,
"name" : "Pete"
}
},
"total" : 24200 //expected 21000
},
{
"_id" : {
"month" : 2,
"agent" : {
"_id" : 1,
"name" : "Joe"
}
},
"total" : 14200 //expected 11000
}
], //missing Sue and Judy
"ok" : 1
}

我的问题是,我似乎没有在管道中找到正确的组合来组合交易和推荐,以便佣金保留在同一个代理人手中。这可以通过 Mongo 中的聚合框架来完成,还是使用 MapReduce 的唯一方法?

最佳答案

稍微尝试一下,似乎有一种方法可以通过聚合管道解决这个问题,但坦率地说,您有一个糟糕的文档结构来编写计算佣金/(月 * 代理)的管道.您是否考虑过让每个文档代表一个“佣金事件”,例如交易或推荐,而不是让每个文档代表一个月?

{
"agent" : { "_id" : 1, "name" : "Joe" },
"month" : 1,
"type" : "deal",
"deal_id" : 1,
"comm" : 10000
}

这些文档的管道非常简单

db.test.aggregate([
{ "$group" : {
"_id" : { "agent_id" : "$agent._id", "month" : "$month" },
"comm" : { "$sum" : "$comm" }
} }
])

我认为这种替代文档结构很有意义,因为

  • 聚合更容易编写(也更快,但从来没有很快,因为它正在处理每个文档)
  • 您可以查询我认为您可能关心的信息,以及更具体的信息,使用这种结构,比月文档结构更容易;例如,对于您的月份文档,您将如何查询大于某个金额的所有佣金?
  • 月文档会增长,可能需要在磁盘上移动,这会影响性能(仅适用于 mmap 存储引擎)

关于mongodb - Mongo聚合,按2个不同数组中的相同字段分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29120400/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com