首页 > 解决方案 > 如何将所有报告中最新的部分合并到一个主报告中?

问题描述

编辑:我发现 mongo 不允许在报告中使用特殊字符(例如点和美元符号)作为键,因此我不得不稍微重新更改 JSON 的结构。但是,我的问题仍然是一样的(我删除了旧的东西,所以它会更具可读性,但你仍然可以在编辑历史记录部分看到它)。新结构如下所示:

{                                                      
    "name": "test1",                                                            
    "main": [                                         
        {                                              
            "subs": [                                  
                {                                      
                    "data": [          
                        {                              
                            "group": "ABC",            
                            "values": [              
                                "tcsh"                 
                            ]                          
                        },                             
                        {                              
                            "group": "AA",            
                            "values": [              
                                "6.13.00"              
                            ]                          
                        }                              
                    ]                                  
                },                                     
                {                                      
                    "data": [          
                        {                              
                            "group": "xyz",            
                            "values": [              
                                "tcsh"                 
                            ]                          
                        },                             
                        {                              
                            "group": "SADA",            
                            "values": [              
                                "6.13.00"              
                            ]                          
                        }                              
                    ]                                  
                }
            ],
            "main_name": "MAIN",
            "main_path": "play_ground/MAIN"
        },
        {
            "subs": [
                {
                    "data": [
                        {
                            "group": "BAB",
                            "values": [
                                "tcsh"
                            ]
                        },
                        {
                            "group": "GO",
                            "values": [
                                "6.13.00"
                            ]
                        }
                    ]
                }
            ],
            "main_name": "MAIN2",
            "main_path": "play_ground/MAIN2"
        }
    ],
    "user": "easdasa",
    "timestamp": "1564437533"
}

我想获取所有具有 nametest1和 user的报告easdasa。然后,我想取data每块的最新块subs。这是在时间戳的帮助下完成的。例如,在以下数组中,我有两个报告:

    [{                                                      
        "name": "test1",                                                            
        "main": [                                         
            {                                              
                "subs": [                                                                      
                    {                                      
                        "data": [          
                            {                              
                                "group": "xyz",            
                                "values": [              
                                    "tcsh"                 
                                ]                          
                            },                             
                            {                              
                                "group": "SADA",            
                                "values": [              
                                    "6.13.00"              
                                ]                          
                            }                              
                        ]                                  
                    }
                ],
                "main_name": "MAIN",
                "main_path": "play_ground/MAIN"
            }
        ],
        "timestamp": "1564437533"
    },
        {                                                      
        "name": "test1",                                                            
        "main": [                                         
            {                                              
                "subs": [                                  
                    {                                      
                        "data": [          
                            {                              
                                "group": "ABC",            
                                "values": [              
                                    "tcsh"                 
                                ]                          
                            },                             
                            {                              
                                "group": "AA",            
                                "values": [              
                                    "6.13.00"              
                                ]                          
                            }                              
                        ]                                  
                    },                                     
                    {                                      
                        "data": [          
                            {                              
                                "group": "xyz",            
                                "values": [              
                                    "tcsh"                 
                                ]                          
                            },                             
                            {                              
                                "group": "SADA",            
                                "values": [              
                                    "5.0.1",
                                    "12312"              
                                ]                          
                            }                              
                        ]                                  
                    }
                ],
                "main_name": "MAIN",
                "main_path": "play_ground/MAIN"
            }
        ],
        "timestamp": "1564437522"
    }]

第一个报告是在第二个报告之后创建的(由于时间戳)。我可以看到第二个报告中有一个块,但第一个报告中没有:

{                                      
    "data": [          
        {                              
            "group": "ABC",            
            "values": [              
                "tcsh"                 
            ]                          
        },                             
        {                              
            "group": "AA",            
            "values": [              
                "6.13.00"              
            ]                          
        }                              
    ]                                  
},                                     

所以我希望最终报告能够解决它(除了第一份报告中的所有内容)。此外,您可以看到该SADA组的值是不同的。所以我们要取第一个的报告块。最终报告应为:

    {                                                      
        "name": "test1",                                                            
        "main": [                                         
            {                                              
                "subs": [
                    {                                      
                        "data": [          
                            {                              
                                "group": "ABC",            
                                "values": [              
                                    "tcsh"                 
                                ]                          
                            },                             
                            {                              
                                "group": "AA",            
                                "values": [              
                                    "6.13.00"              
                                ]                          
                            }                              
                        ]                                  
                    },                  
                    {                                      
                        "data": [          
                            {                              
                                "group": "xyz",            
                                "values": [              
                                    "tcsh"                 
                                ]                          
                            },                             
                            {                              
                                "group": "SADA",            
                                "values": [              
                                    "6.13.00"              
                                ]                          
                            }                              
                        ]                                  
                    }
                ],
                "main_name": "MAIN",
                "main_path": "play_ground/MAIN"
            }
        ],
        "timestamp": "1564437533"
    }

换句话说,在data级别的 (json) 值中,我想获取最新报告,在subs级别的 (json) 值中,我想获取所有现有的潜艇。所以会更清楚,在data级别的 (json) 值中,我想要获取最新报告的所有组和值,而对于subs级别的 (json) 值,我想要拥有所有子项。

如果我可以指定步骤:

为了获得想要的报告,我应该进行哪个查询?

标签: mongodbmongodb-query

解决方案


请使用以下查询并检查统计信息,我真的可以说可以通过根据您的要求(查询)进行适当的索引来提高性能,请使用$explain在此处输入链接描述)来检查查询性能。我认为您的数组存在于一个以键为的字段中,请让我知道这是否有效,或者如果它不提供示例数据,我们可以检查一下:

db.getCollection('yourcollection').aggregate([{$unwind: '$values'},{$match : {'values.name': 'test1', 'values.user': 'galih'}},
{$sort: {'values.timestamp' : -1}},
{$limit: 1}
])

推荐阅读