gpt4 book ai didi

mongodb - 使用对象数组在 MongoDB 中进行聚合

转载 作者:行者123 更新时间:2023-12-04 17:29:49 25 4
gpt4 key购买 nike

我有以下 mongoDB 文档 -

{
"_id" : ObjectId("5e71a1f3081c4b70cdbc438f"),
"DataSetID" : ObjectId("5e71a1f3081c4b70cdbc438e"),
"row" : [
{
"key" : "Region",
"prev" : "root",
"value" : "Australia and Oceania",
"typeOfValue" : "string",
"currentDepth" : 1
},
{
"key" : "Country",
"prev" : "root",
"value" : "Tuvalu",
"typeOfValue" : "string",
"currentDepth" : 1
},
{
"key" : "Item Type",
"prev" : "root",
"value" : "Baby Food",
"typeOfValue" : "string",
"currentDepth" : 1
},
{
"key" : "Sales Channel",
"prev" : "root",
"value" : "Offline",
"typeOfValue" : "string",
"currentDepth" : 1
},
{
"key" : "Order Priority",
"prev" : "root",
"value" : "H",
"typeOfValue" : "string",
"currentDepth" : 1
},
{
"key" : "Order Date",
"prev" : "root",
"value" : ISODate("2010-05-27T18:30:00.000Z"),
"typeOfValue" : "date",
"currentDepth" : 1
},
{
"key" : "Order ID",
"prev" : "root",
"value" : 669165933,
"typeOfValue" : "number",
"currentDepth" : 1
},
{
"key" : "Ship Date",
"prev" : "root",
"value" : ISODate("2010-06-26T18:30:00.000Z"),
"typeOfValue" : "date",
"currentDepth" : 1
},
{
"key" : "Units Sold",
"prev" : "root",
"value" : 9925,
"typeOfValue" : "number",
"currentDepth" : 1
},
{
"key" : "Unit Price",
"prev" : "root",
"value" : 255.28,
"typeOfValue" : "number",
"currentDepth" : 1
},
{
"key" : "Unit Cost",
"prev" : "root",
"value" : 159.42,
"typeOfValue" : "number",
"currentDepth" : 1
},
{
"key" : "Total Revenue",
"prev" : "root",
"value" : 2533654,
"typeOfValue" : "number",
"currentDepth" : 1
},
{
"key" : "Total Cost",
"prev" : "root",
"value" : 1582243.5,
"typeOfValue" : "number",
"currentDepth" : 1
},
{
"key" : "Total Profit",
"prev" : "root",
"value" : 951410.5,
"typeOfValue" : "number",
"currentDepth" : 1
}
]
}

假设我们有 100 份这样的文档。我想进行一个聚合查询,让我们说出 key == 'Country' 的值,即 Tuvalu 、 India 等,并给我每个国家的 key == 'Total Profit' 值的总和。

换句话说,给我 values 的总和,其中 key == 'Total Profit' 同时根据 key = = '国家'

考虑到我输入的是非结构化 JSON 数据,并且我事先不知道 key ,因此可以更改数据结构,这就是我想出 json 数组的原因。

最后我想要这样的结果:

[
{
_id : 'Tuvalu',
value : 100
},
{
_id : 'India',
value : 160
}
]

我们怎样才能做到这一点?

最佳答案

试试下面的查询,它有可选阶段以更好地优化,您可以根据需要/选择排除:

db.collection.aggregate([
/** Optional match stage but can reduce data set size for further stages
* (Get docs where rows array has an object with a key field & value 'Country') */
{ $match: { "row.key": "Country" } },
/** Using project to retain only needed fields which reduce size of doc,
* Convert row array into row object {country : ..., totalProfit : ... } */
{
$project: {
_id: 0,
row: {
/** Iterate on row's, So '$$this' is each object & '$$value' is values in initialValue */
$reduce: {
input: "$row",
initialValue: {
country: "",
totalProfit: 0
},
in: {
country: {
/** If current object key is Country then push value from current object to 'country' in initialValue
* otherwise return existing 'country' value to 'country' every time */
$cond: [
{ $eq: ["$$this.key", "Country"] },
"$$this.value",
"$$value.country"
]
},
totalProfit: {
$cond: [
{ $eq: ["$$this.key", "Total Profit"] },
"$$this.value",
"$$value.totalProfit"
]
}
}
}
}
}
},
/** group on country field & sumup values of totalProfit */
{
$group: { _id: "$row.country", value: { $sum: "$row.totalProfit" } }
}
]);

测试: MongoDB-Playground

关于mongodb - 使用对象数组在 MongoDB 中进行聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60784585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com