2015-12-01 28 views
0

我想采用两个聚合并将它们组合在一起。 “Blakes Seven”通过几次查询帮助我检索第一个和第二个数组元素值,但我需要将这两者结合在一起。如何在相同的结果中将两个单独的聚合组合在一起

第一招:

db.getCollection('anothertest').aggregate([ 
{ "$unwind": "$a" }, 
{ "$group": { 
    "_id": "$_id", 
    "first": { "$first": "$a" } 
}} 
]) 

给出的结果是:

{ 
"result" : [ 
    { 
     "_id" : ObjectId("565cc5261506995581569439"), 
     "first" : 4 
    } 
], 
"ok" : 1.0000000000000000 
} 

第二个:

db.getCollection('anothertest').aggregate([ 
{ "$unwind": "$a" }, 
// Keeps the first element 
{ "$group": { 
    "_id": "$_id", 
    "first": { "$first": "$a" }, 
    "a": { "$push": "$a" } 
}}, 
{ "$unwind": "$a" } 
, 
// Removes the first element 
{ "$redact": { 
"$cond":{ 
"if": { "$ne": [ "$first", "$a" ] }, 
"then": "$$KEEP", 
    "else": "$$PRUNE" 
} 
}} 

给出结果:

{ 
"result" : [ 
    { 
     "_id" : ObjectId("565cc5261506995581569439"), 
     "second" : 2 
    } 
], 
"ok" : 1.0000000000000000 
} 

我需要的是的结果:

{ 
"result" : [ 
    { 
     "_id" : ObjectId("565cc5261506995581569439"), 
     "first" : 4 
     "second" : 2 
    } 
], 
"ok" : 1.0000000000000000 
} 

除此之外,它是基于该文件是只是其中的值坐为数组中的元素的例子。我将如何在嵌套数组上使用它?如果这对Aggregation来说很复杂,那么使用Map Reduce可能会有更简单的方法来实现这一点?感谢您提供的任何帮助。

对上述文件是下面:

{ 
"_id" : ObjectId("565cc5261506995581569439"), 
"a" : [ 
    4, 
    2, 
    8, 
    71, 
    21 
] 
} 

更新到我原来的职位 我现在已经成功地采取真棒脚本,使之成为我的文档已嵌套阵列工作 - 高达一个点。

{ "$match": {objectOriginAPI : "Profit & Loss"}}, 
{ "$unwind": "$objectRawOriginData.Reports" }, 
     { "$unwind": "$objectRawOriginData.Reports.Rows" }, 
     { "$unwind": "$objectRawOriginData.Reports.Rows.Rows" }, 
     { "$unwind": "$objectRawOriginData.Reports.Rows.Rows.Cells" }, 
{ "$group": { 
    "_id": "$_id", 
    "first": { "$first": "$objectRawOriginData.Reports.Rows.Rows.Cells.Value" }, 
    "a": { "$push": "$objectRawOriginData.Reports.Rows.Rows.Cells.Value" } 
}}, 
{ "$unwind": "$a" }, 
{"$skip":1}, 
{ "$group": { 
    "_id": "$_id", 
    "BalanceName": { "$first": "$first" }, 
    "BalanceValue": { "$first":  "$objectRawOriginData.Reports.Rows.Rows.Cells.Value" }, 
}} 
]) 

其实,我忘了更新第二个$ unwind,所以它仍然是“$ a”。而实际情况是,我得到了以下结果:

{ 
"result" : [ 
    { 
     "_id" : ObjectId("564d12da1506995581569428"), 
     "BalanceName" : "Sales", 
     "BalanceValue" : null 
    } 
], 
"ok" : 1.0000000000000000 
} 

但是,当我改变了$开卷匹配$放松的第一个值,我没有得到任何结果的。我无法理解为什么,有什么想法?谢谢,Matt

+0

马特,请不要编辑您的原始询问帖子与原来写的不同的问题。如果您有其他问题,请在单独的新问题中提问。阅读StackOverflow的帮助部分将告诉你如何提出很好的问题,这直接影响了获得良好答案的可能性。 – joao

+0

我会给它一个阅读,谢谢。问题在于我根据答案尝试过,然后意识到需要进一步澄清并稍加解释。我去创建一个新的答案,我被告知不要回答我自己的问题,尽管这不是一个答案,而是从第一个答案开始。我想添加的内容不适合发表评论。因此,我没有理由创建新帖子,而是编辑了原始帖子,并明确了添加额外内容的位置,而不是编辑。道歉,如果这打破了协议 –

回答

1

您可以按照与您发布的第一个聚合相同的逻辑来执行此操作。请注意,我使用$skip来跳过第一个数组元素并获得第二个数组元素。

db.collection.aggregate([ 
    { "$match": { 
     "_id": ObjectId("565cc5261506995581569439") 
    }}, 
    { "$unwind": "$a" }, 
    { "$group": { 
     "_id": "$_id", 
     "first": { "$first": "$a" }, 
     "a": { "$push": "$a" } 
    }}, 
    { "$unwind": "$a" }, 
    {"$skip":1}, 
    { "$group": { 
     "_id": "$_id", 
     "first": { "$first": "$first" }, 
     "second": { "$first": "$a" }, 
    }} 
]) 

结果:

{ 
    "_id" : ObjectId("565cc5261506995581569439"), 
    "first" : 4, 
    "second" : 2 
} 

你的第二个聚集也相当接近所需的输出:

db.collection.aggregate([ 
    { "$match": { 
     "_id": ObjectId("565cc5261506995581569439") 
    }}, 
    { "$unwind": "$a" }, 
    { "$group": { 
     "_id": "$_id", 
     "first": { "$first": "$a" }, 
     "a": { "$push": "$a" } 
    }}, 
    { "$unwind": "$a" }, 
    { "$redact": { 
     "$cond":{ 
     "if": { "$ne": [ "$first", "$a" ] }, 
      "then": "$$KEEP", 
      "else": "$$PRUNE" 
    }}}, 
    { "$limit": 1}, 
    { "$project": { 
     "_id":1, 
     "first":1, 
     "second":"$a" 
    }} 
]) 

编辑:此外,因为它们是,无论是聚合只为工作单个文件,因此必须添加最初的步骤$match

+0

太棒了!感谢您的帮助,我现在将全面检查并给您一些反馈,非常感谢! –

+0

这个工作真的很好,哪里有一个文件要处理。我用不同的数字添加了第二个文档,并返回了两个结果。第二个结果是我的新文件完美地完成了第一个和第二个。但是,第一个和第二个值的结果是第一个值。 –

+0

如果我将{limit}更改为2,则可以看到我的两个文档的结果,它与另一个脚本完成了非常类似的操作。这一次,第二个结果对于[first]和[second]是正确的。第一个结果与第二个结果具有相同的值[first]。任何想法为什么结果或者看起来不可靠或者一次不能用于多个文档。如果我完全删除了限制,我最终得到7个结果,只有一个数组集合是正确的。有任何想法吗? –

相关问题