如何展开单个文档然后在数组中处理成单个结果

时间:2015-12-02 22:38:31

标签: json mongodb report

我得到了@Joao和@Blakes Seven的一些帮助,以便尽可能地得到我。真棒,非常感谢你们。 我遇到的问题是从我原来的简单例子开始,并将其应用到我的现实生活场景中。

我需要的是两个独立的脚本,它们可以完美地工作,但是当我尝试将两者结合在一起时,它只会在不应用第二部分的情况下完成第一部分;这是我在Mongo让我失望的经验。

因此,我可以使用以下代码从文档中的第一个数组中获取名称值对:

db.raw_originBusinessData.aggregate([
{ "$match": {objectOriginAPI : "Profit & Loss"}}
,{ "$unwind": "$objectRawOriginData.Reports" }
,{ "$unwind": "$objectRawOriginData.Reports.Rows" }
,{ "$unwind": "$objectRawOriginData.Reports.Rows.Rows" }
,{ "$group": {"_id": "$_id","first": { "$first": "$objectRawOriginData.Reports.Rows.Rows.Cells.Value" }
,   "temp": { "$push": "$objectRawOriginData.Reports.Rows.Rows.Cells.Value" }
}},
{ "$unwind": "$temp" }
,{"$skip":1}
,{ "$group": {"_id": "$_id", "AccountBalance":{ "$first": "$first" }
}}
])

这给了我下面的结果,除了我无法在账户余额数组中命名这两个值之外,我很满意。

任务1 :我希望AccountBalance是一个数组,第一个位置有两个值:“AccountName”:“Sales”,“AccountValue”:5428.04。

{
"result" : [ 
    {
        "_id" : ObjectId("564d12da1506995581569428"),
        "AccountBalance" : [ 
            "Sales", 
            "5428.64"
        ]
    }
],
"ok" : 1.0000000000000000
}

问题的第二部分是它只处理一组值,而我正在处理的文件有9套要做。我在文档上运行了以下$ unwind,它将它们完美地分成了9个结果:

db.raw_originBusinessData.aggregate([
// find document
{ "$match": {objectOriginAPI : "Profit & Loss"}}

// unwind into multiple documents
,{ "$unwind": "$objectRawOriginData.Reports" }
,{ "$unwind": "$objectRawOriginData.Reports.Rows" }
,{ "$unwind": "$objectRawOriginData.Reports.Rows.Rows" }
])

所以我得到了9个完美的结果。 任务2:我想要做的是将它与我​​上面显示的脚本结合起来。我尝试了以下内容,但它绝对不会比上面的脚本更多。

db.raw_originBusinessData.aggregate([
// find document
{ "$match": {objectOriginAPI : "Profit & Loss"}}

// unwind into multiple documents
,{ "$unwind": "$objectRawOriginData.Reports" }
,{ "$unwind": "$objectRawOriginData.Reports.Rows" }
,{ "$unwind": "$objectRawOriginData.Reports.Rows.Rows" }
]
// process each document
,{ "$unwind": "$objectRawOriginData.Reports" }
, {"$unwind": "$objectRawOriginData.Reports.Rows" }
, {"$unwind": "$objectRawOriginData.Reports.Rows.Rows" }
, {"$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", "AccountBalance":{ "$first": "$first" }
}}  
)

期望的结果

我想得到的是以下内容。这是任务1和2的组合。

{
"result" : [ 
    {
        "_id" : ObjectId("564d12da1506995581569428"),
        "AccountBalance" : [ 
            {"AccountName" : "Sales", 
            "AccountValue" : "5428.64"},
            {"AccountName" : "Total Income", 
            "AccountValue" : "5428.64"},
            {"AccountName" : "Cost of Sales", 
            "AccountValue" : "100.00"},
            {"AccountName" : "Total Cost of Sales", 
            "AccountValue" : "100.00"},
            {"AccountName" : "Gross Profit", 
            "AccountValue" : "5328.64"},
            {"AccountName" : "Advertising", 
            "AccountValue" : "100.00"},
            {"AccountName" : "General Expenses", 
            "AccountValue" : "100.00"},
            {"AccountName" : "Total Operating Expenses", 
            "AccountValue" : "200.00"},
            {"AccountName" : "Net Profit", 
            "AccountValue" : "5128.64"}
        ]
    }
],
"ok" : 1.0000000000000000
}

我作为来源使用的文档来自Xero API - 这是他们的报告之一。它与大多数使用JSON导出的报表具有相同的模式,如Oracle。以下是实际报告,以便您参考。

感谢一百万人,非常感谢!

{
"_id" : ObjectId("564d12da1506995581569428"),
"objectClass" : "Origin Data",
"objectCategory" : "Application",
"objectType" : "Customer",
"connection_id" : "562033dfca91840cd0c7c54f",
"connectionName" : "Building Accounts",
"entity_id" : "564149bcca9183a8d0c7c83c",
"objectCreationDate" : "2015-11-19 14:43:40",
"objectCycleID" : "12345678",
"objectStatus" : "PROCESSED",
"objectOrigin" : "Xero",
"objectOriginAPI" : "Profit & Loss",
"objectOriginService" : "Xero API - Profit & Loss v 1.0.0.8",
"objectRawOriginData" : {
    "Id" : "d6e7fb37-9f2e-45ae-b0a4-de62aa95a783",
    "Status" : "OK",
    "ProviderName" : "Xero API Previewer",
    "DateTimeUTC" : "/Date(1443405874333)/",
    "Reports" : [ 
        {
            "ReportID" : "ProfitAndLoss",
            "ReportName" : "Profit and Loss",
            "ReportType" : "ProfitAndLoss",
            "ReportTitles" : [ 
                "Profit & Loss", 
                "Paddy's markets", 
                "28 September 2014 to 28 September 2015"
            ],
            "ReportDate" : "28 September 2015",
            "UpdatedDateUTC" : "/Date(1443405874333)/",
            "Fields" : [],
            "Rows" : [ 
                {
                    "RowType" : "Header",
                    "Cells" : [ 
                        {
                            "Value" : ""
                        }, 
                        {
                            "Value" : "28 Sep 15"
                        }
                    ]
                }, 
                {
                    "RowType" : "Section",
                    "Title" : "Income",
                    "Rows" : [ 
                        {
                            "RowType" : "Row",
                            "Cells" : [ 
                                {
                                    "Value" : "Sales",
                                    "Attributes" : [ 
                                        {
                                            "Value" : "a7e3f9e4-6f63-4b25-ae36-107131e8b9be",
                                            "Id" : "account"
                                        }
                                    ]
                                }, 
                                {
                                    "Value" : "5428.64",
                                    "Attributes" : [ 
                                        {
                                            "Value" : "a7e3f9e4-6f63-4b25-ae36-107131e8b9be",
                                            "Id" : "account"
                                        }
                                    ]
                                }
                            ]
                        }, 
                        {
                            "RowType" : "SummaryRow",
                            "Cells" : [ 
                                {
                                    "Value" : "Total Income"
                                }, 
                                {
                                    "Value" : "5428.64"
                                }
                            ]
                        }
                    ]
                }, 
                {
                    "RowType" : "Section",
                    "Title" : "Less Cost of Sales",
                    "Rows" : [ 
                        {
                            "RowType" : "Row",
                            "Cells" : [ 
                                {
                                    "Value" : "Cost of Sales",
                                    "Attributes" : [ 
                                        {
                                            "Value" : "f78f7118-ad98-4862-a63c-39dd3c5ace8a",
                                            "Id" : "account"
                                        }
                                    ]
                                }, 
                                {
                                    "Value" : "100.00",
                                    "Attributes" : [ 
                                        {
                                            "Value" : "f78f7118-ad98-4862-a63c-39dd3c5ace8a",
                                            "Id" : "account"
                                        }
                                    ]
                                }
                            ]
                        }, 
                        {
                            "RowType" : "SummaryRow",
                            "Cells" : [ 
                                {
                                    "Value" : "Total Cost of Sales"
                                }, 
                                {
                                    "Value" : "100.00"
                                }
                            ]
                        }
                    ]
                }, 
                {
                    "RowType" : "Section",
                    "Title" : "",
                    "Rows" : [ 
                        {
                            "RowType" : "Row",
                            "Cells" : [ 
                                {
                                    "Value" : "Gross Profit"
                                }, 
                                {
                                    "Value" : "5328.64"
                                }
                            ]
                        }
                    ]
                }, 
                {
                    "RowType" : "Section",
                    "Title" : "Less Operating Expenses",
                    "Rows" : [ 
                        {
                            "RowType" : "Row",
                            "Cells" : [ 
                                {
                                    "Value" : "Advertising",
                                    "Attributes" : [ 
                                        {
                                            "Value" : "67466588-132b-48ce-b897-0ceabffd7a9d",
                                            "Id" : "account"
                                        }
                                    ]
                                }, 
                                {
                                    "Value" : "100.00",
                                    "Attributes" : [ 
                                        {
                                            "Value" : "67466588-132b-48ce-b897-0ceabffd7a9d",
                                            "Id" : "account"
                                        }
                                    ]
                                }
                            ]
                        }, 
                        {
                            "RowType" : "Row",
                            "Cells" : [ 
                                {
                                    "Value" : "General Expenses",
                                    "Attributes" : [ 
                                        {
                                            "Value" : "fdb25d7a-2fc8-406a-bf4b-6b4e8014b8cb",
                                            "Id" : "account"
                                        }
                                    ]
                                }, 
                                {
                                    "Value" : "100.00",
                                    "Attributes" : [ 
                                        {
                                            "Value" : "fdb25d7a-2fc8-406a-bf4b-6b4e8014b8cb",
                                            "Id" : "account"
                                        }
                                    ]
                                }
                            ]
                        }, 
                        {
                            "RowType" : "SummaryRow",
                            "Cells" : [ 
                                {
                                    "Value" : "Total Operating Expenses"
                                }, 
                                {
                                    "Value" : "200.00"
                                }
                            ]
                        }
                    ]
                }, 
                {
                    "RowType" : "Section",
                    "Title" : "",
                    "Rows" : [ 
                        {
                            "RowType" : "Row",
                            "Cells" : [ 
                                {
                                    "Value" : "Net Profit"
                                }, 
                                {
                                    "Value" : "5128.64"
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}
}

1 个答案:

答案 0 :(得分:0)

完成它,见下文,谢谢:

db.raw_originBusinessData.aggregate([
{ "$match": {objectOriginAPI : "Profit & Loss"}}
,{ "$unwind": "$objectRawOriginData.Reports" }
,{ "$unwind": "$objectRawOriginData.Reports.Rows" }
,{ "$unwind": "$objectRawOriginData.Reports.Rows.Rows" }
,{ "$group": {"_id": "$_id","accountBalances": { "$push": "$objectRawOriginData.Reports.Rows.Rows.Cells.Value" }
}},
])