首页 > 解决方案 > 查找具有已知子对象值和动态父对象的 mongoDB 文档

问题描述

我们将数据按国家代码存储在 mongodb 中。我们的文档将如下所示,

{
    "_id" : ObjectId("5d82009cddf8d111b0f5c0f9"),
    "title" : "Keystone Korner",
    "CA" : {
        "dlp" : 21.99,
        "dlpCurrencyCode" : "CAD",
        "sales" : {
            "changeProceedsPriorDay" : 0.0,
            "changeUnitsPriorDay" : 0,
            "consumerPriceCurrencyCode" : null,
            "last30Proceeds" : 0.0,
            "last30Units" : 0,
            "last365Proceeds" : 4.22,
            "last365Units" : 4,
            "last60Proceeds" : 0.0,
            "last60Units" : 0,
            "last7Proceeds" : 0.0,
            "last7Units" : 0,
            "last90Proceeds" : 0.0,
            "last90Units" : 0,
            "lastAvgSalesPrice" : 0.0,
            "lastAvgSalesPricePrior" : 0.0,
            "lastProceeds" : 0.0,
            "lastProceedsPct" : 0.0,
            "lastProceedsPrior" : 0.0,
            "lastSalesDate" : "2021-08-23",
            "lastUnits" : 0,
            "lastUnitsPct" : 0.0,
            "lastUnitsPrior" : 0
        }
    },
    "US" : {
        "dlp" : 17.99,
        "dlpCurrencyCode" : "USD",
        "sales" : {
            "changeProceedsPriorDay" : 0.0,
            "changeUnitsPriorDay" : 0,
            "consumerPriceCurrencyCode" : null,
            "last30Proceeds" : 4.18,
            "last30Units" : 2,
            "last365Proceeds" : 51.66,
            "last365Units" : 19,
            "last60Proceeds" : 4.18,
            "last60Units" : 2,
            "last7Proceeds" : 0.0,
            "last7Units" : 0,
            "last90Proceeds" : 7.37,
            "last90Units" : 4,
            "lastAvgSalesPrice" : 0.0,
            "lastAvgSalesPricePrior" : 0.0,
            "lastProceeds" : 0.0,
            "lastProceedsPct" : 0.0,
            "lastProceedsPrior" : 0.0,
            "lastSalesDate" : "2021-08-25",
            "lastUnits" : 0,
            "lastUnitsPct" : 0.0,
            "lastUnitsPrior" : 0
        }
    }
}

我在这里只提供了几个国家列表,但每个文档可以包含近 80-100 个不同的国家列表。

lastSalesDate我们的要求是在每个国家/地区识别来自sales父母的最新信息。因此,如果我们能够列出所有lastSalesDate内容,我们可能能够对其进行排序并将其限制为 1

我们如何在不知道父母(美国、CA、GB 等国家代码)的情况下实现这一目标?

提前致谢。

标签: mongodb

解决方案


这个聚合

[
    {
        '$project': {
            't': {
                '$objectToArray': '$$ROOT'
            }
        }
    }, {
        '$project': {
            'g': {
                '$map': {
                    'input': {
                        '$filter': {
                            'input': '$t', 
                            'as': 'tt', 
                            'cond': {
                                '$and': [
                                    {
                                        '$ne': [
                                            '$$tt.k', '_id'
                                        ]
                                    }, {
                                        '$ne': [
                                            '$$tt.k', 'title'
                                        ]
                                    }
                                ]
                            }
                        }
                    }, 
                    'as': 'featuresF', 
                    'in': {
                        'countyCode': '$$featuresF.k', 
                        'lastSale': '$$featuresF.v.sales.lastSalesDate'
                    }
                }
            }
        }
    }
]

返回像

这 :

{
_id:"12313131313131313",
[{
countyCode:"US",
lastSale:"2021-08-25"
},
{
countyCode:"CA",
lastSale:"2021-08-23"
}]
}

因此,如果您想要其他内容,请提供一些示例首选输出,在此阶段之后,我们可以使用此数据查询或排序或执行等操作


推荐阅读