MongoDB - JSON parsing

MongoDB - JSON parsing

本文关键字:parsing JSON MongoDB      更新时间:2023-09-26

我在MongoDB中有一个有效的JSON结构,需要在运行时进行更改。以下是单个集合中 3 个此类独立文档的有效快照:-

{
    company : "ABC",
    tags : ["ADMIN", "QA"],
    year : 2010,
    Project : [{
            Domain : "Telecom",
            tags : ["DEV", "ADMIN"],
            size : 15
        }, {
            Domain : "Retail",
            tags : ["ADMIN", "DEV"],
            size : 35
        }, {
            Domain : "Finance",
            tags : ["ADMIN"],
            size : 25
        }
    ]
}
{
    company : "ABC",
    tags : ["QA"],
    year : 2011,
    Project : [{
            Domain : "Telecom",
            tags : ["DEV"],
            size : 15
        }, {
            Domain : "Retail",
            tags : ["ADMIN", "DEV"],
            size : 35
        }, {
            Domain : "Finance",
            tags : ["ADMIN"],
            size : 25
        }
    ]
}
{
    company : "ABC",
    tags : ["QA"],
    year : 2012,
    Project : [{
            Domain : "Telecom",
            tags : ["DEV", "ADMIN"],
            size : 15
        }, {
            Domain : "Retail",
            tags : ["ADMIN", "DEV"],
            size : 35
        }, {
            Domain : "Finance",
            tags : ["ADMIN"],
            size : 25
        }
    ]
}

该结构需要将这 3 个文档合并为 1,然后按以下方式显示:-

{
    "company" : "ABC",
    "tags" : ["ADMIN", "QA"],
    "period" : {
        [{
                year : 2010,
                Project : [{
                        Domain : "Telecom",
                        tags : ["DEV", "ADMIN"],
                        size : 15
                    }, {
                        Domain : "Retail",
                        tags : ["ADMIN", "DEV"],
                        size : 35
                    }, {
                        Domain : "Finance",
                        tags : ["ADMIN"],
                        size : 25
                    }
                ]
            }
        ],
        [{
                year : 2011,
                Project : [{
                        Domain : "Telecom",
                        tags : ["DEV"],
                        size : 15
                    }, {
                        Domain : "Retail",
                        tags : ["ADMIN", "DEV"],
                        size : 35
                    }, {
                        Domain : "Finance",
                        tags : ["ADMIN"],
                        size : 25
                    }
                ]
            }
        ],
        [{
                year : 2012,
                Project : [{
                        Domain : "Telecom",
                        tags : ["DEV", "ADMIN"],
                        size : 15
                    }, {
                        Domain : "Retail",
                        tags : ["ADMIN", "DEV"],
                        size : 35
                    }, {
                        Domain : "Finance",
                        tags : ["ADMIN"],
                        size : 25
                    }
                ]
            }
        ]
    }
}

我知道我可以使用地图减少并完成这项工作。但我认为我应该尝试为此编写一个 Java 脚本函数,然后可以在需要这样做时调用它。

假设可以使用集合调用以下函数,则记录集将传递给下面的函数。

`var curlprojects = function()
{
    var arrSyn = new Array();
    var JSONString = "";
    var doc;
    var parent;
    var arrTop = new Array();
    while (myCursor.hasNext()) 
    {
        doc = myCursor.next();
        parent = doc.companyName;
        var fulltext = "{'"year'":" + tojson(doc.year) + ",'"project'":" + tojson(doc.project) + "}";
        JSONString = JSONString + fulltext;
    };
    arrSyn.push(JSONString);
    var outext = "{'"period'":" + JSONString + "}";
    print(outext);
}   `

问题来了。尽管文本看起来像是 JSON,就像我生成或打印出来时一样,但它不会打印到屏幕上。

最后一行 print(outext) 显示一些奇怪的消息,询问我是否希望显示 181 个首选项,如果我说是 - 它列出了 java 脚本中的所有保留字!!

任何建议将不胜感激。

作为使用MapReduce或Javascript的替代方法,您可能需要考虑使用聚合框架。

你想要的输出可以在 Mongo shell 中生成:

db.test.aggregate([
  //optional: match a single company
  {$match:{"company":"ABC"}},
  //expand the "tags" array
  {$unwind:"$tags"},
  //"group by" stage:
  {$group: {
    //group by company
    _id:"$company",
    //add unique tags into the "tags" array
    tags: {$addToSet:"$tags"},
    //add the "Project" details into the "period" array
    period: {$push: {year:"$year", Project:"$Project"}}
  }}
])