我想采用两个聚合并将它们组合在一起。 “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
马特,请不要编辑您的原始询问帖子与原来写的不同的问题。如果您有其他问题,请在单独的新问题中提问。阅读StackOverflow的帮助部分将告诉你如何提出很好的问题,这直接影响了获得良好答案的可能性。 – joao
我会给它一个阅读,谢谢。问题在于我根据答案尝试过,然后意识到需要进一步澄清并稍加解释。我去创建一个新的答案,我被告知不要回答我自己的问题,尽管这不是一个答案,而是从第一个答案开始。我想添加的内容不适合发表评论。因此,我没有理由创建新帖子,而是编辑了原始帖子,并明确了添加额外内容的位置,而不是编辑。道歉,如果这打破了协议 –