【发布时间】:2018-05-15 15:13:20
【问题描述】:
我有以下 mongo 集合:
{
"_id" : "22pTvYLd7azAAPL5T",
"plate" : "ABC-123",
"company": "AMZ",
"_portfolioType" : "account"
},
{
"_id" : "22pTvYLd7azAAPL5T",
"plate" : "ABC-123",
"_portfolioType" : "sale",
"price": 87.3
},
{
"_id" : "22pTvYLd7azAAPL5T",
"plate" : "ABC-123",
"_portfolioType" : "sale",
"price": 88.9
}
我正在尝试聚合在plate 字段中具有相同值的所有文档。以下是我目前写的查询:
db.getCollection('temp').aggregate([
{
$lookup: {
from: 'temp',
let: { 'p': '$plate', 't': '$_portfolioType' },
pipeline: [{
'$match': {
'_portfolioType': 'sale',
'$expr': { '$and': [
{ '$eq': [ '$plate', '$$p' ] },
{ '$eq': [ '$$t', 'account' ] }
]}
}
}],
as: 'revenues'
},
},
{
$project: {
plate: 1,
company: 1,
totalTrades: { $arrayElemAt: ['$revenues', 0] },
},
},
{
$addFields: {
revenue: { $add: [{ $multiply: ['$totalTrades.price', 100] }, 99] },
},
},
{
$group: {
_id: '$company',
revenue: { $sum: '$revenue' },
}
}
])
如果我删除$group 阶段,查询工作正常,但是,只要我添加$group 阶段,mongo 就会开始无限处理。我尝试添加$match 作为第一阶段,以限制要处理的文档数量,但没有任何运气。例如:
{
$match: { $or: [{ _portfolioType: 'account' }, { _portfolioType: 'sale' }] }
},
我也尝试使用{ explain: true },但它没有返回任何有用的信息。
【问题讨论】:
-
它“工作正常”,因为它会在第一批文档可用时立即返回一个光标。 $group 是一个阻塞阶段。它需要所有先前的阶段才能完成。 $lookup 看起来不正确。你想在那里做什么?
-
您能否提供所需的最终结果。写“试图聚合所有在板块字段中具有相同值的文档”的语句不是很直观。
-
好的,我的最终目标是获取每个“公司”(公司字段)的文档,其计数为
plate(即具有唯一plate的公司的文档数量和计算的收入字段基本上是:获取与_portfolioType: sale相关联的所有文档plate -
我正要讨论索引,直到我意识到你正在做一个“自我加入”回到同一个集合。你可能不需要这样做。看看Aggregation filter after $lookup,其中“尽管有问题标题”,但该特定问题的实际解决方案(OP 也在执行“自加入”)实际上根本不涉及
$lookup。您可能会问一些非常相似的问题,如果您不确定,那么您应该按照要求显示一些文件和预期结果。
标签: mongodb aggregation-framework