修改聚合函数以获得重新格式化的结果
Modifying the Aggregation Function to get a reformatted result
我在 mongodb
中有这样的数据集
[
{
"task_id": "as4d2rds5",
"url": "https:example1.com",
"organization": "Avengers",
"val": "null"
},
{
"task_id": "rfre43fed",
"url": "https:example1.com",
"organization": "Avengers",
"val": "valid"
},
{
"task_id": "uyje3dsxs",
"url": "https:example2.com",
"organization": "Metro",
"val": "valid"
},
{
"task_id": "ghs563vt6",
"url": "https:example1.com",
"organization": "Avengers",
"val": "invalid"
},
{
"task_id": "erf6egy64",
"url": "https:example2.com",
"organization": "Metro",
"val": "null"
}
]
我正在尝试创建一个 mongodb 聚合函数,以便它会产生类似
的结果
[
{
"Metro": {
"invalid": 0,
"null": 1,
"valid": 1,
"url": "https:example2.com"
},
},
{
"Avengers": {
"invalid": 1,
"null": 1,
"valid": 1,
"url": "https:example1.com"
}
}
]
我从 Whosebug 得到了很多帮助才能到达这里。
我需要重新格式化从聚合器接收到的数据,以便它产生上述结果。目前的聚合脚本是
db.collection.aggregate([ {"$group": {"_id": {"k": "$organization","v": "$val"},"cnt": {"$sum": 1},"url": {$first: "$url"}}},
{"$project": {"_id": 0, "url": 1, "k": "$_id.k", "o": {"k": "$_id.v", "v": "$cnt"}}},
{"$group": {"_id": "$k", "v": { "$push": "$o"}, "url": {"$first": "$url"}}},
{"$addFields": {"v": {"$mergeObjects": [{"null": 0,"valid": 0,"invalid": 0},{"$arrayToObject": "$v"}]}}},
{"$project": {"_id": 0, "url": 1, "new": [{"k": "$_id","v": "$v"}]}},
{"$addFields": {"new": {"$mergeObjects": [{"$arrayToObject": "$new"},{"url": "$url"}]}}},
{"$replaceRoot": {"newRoot": "$new"}} ])
您可以尝试此查询以避免多个 $group
(作为权衡,您有三个 $filter
,但我认为这仍然比多个 $group
好):
此查询按organization
分组,然后使用$project
输出存在多少个“valid”、“invalid”和“null”的大小。
编辑:您还可以添加一个额外的步骤$replaceRoot
以获得与您想要的完全相同的输出。
db.collection.aggregate([
{
"$group": {
"_id": "$organization",
"val": {
"$push": "$val"
},
"url": {
"$first": "$url"
}
}
},
{
"$project": {
"_id": 0,
"organization": [
{
"k": "$_id",
"v": {
"url": "$url",
"invalid": {
"$size": {
"$filter": {
"input": "$val",
"cond": {
"$eq": [
"$$this",
"invalid"
]
}
}
}
},
"valid": {
"$size": {
"$filter": {
"input": "$val",
"cond": {
"$eq": [
"$$this",
"valid"
]
}
}
}
},
"null": {
"$size": {
"$filter": {
"input": "$val",
"cond": {
"$eq": [
"$$this",
"null"
]
}
}
}
}
}
}
]
}
},
{
"$replaceRoot": {
"newRoot": {
"$arrayToObject": "$organization"
}
}
}
])
示例here
我在 mongodb
中有这样的数据集[
{
"task_id": "as4d2rds5",
"url": "https:example1.com",
"organization": "Avengers",
"val": "null"
},
{
"task_id": "rfre43fed",
"url": "https:example1.com",
"organization": "Avengers",
"val": "valid"
},
{
"task_id": "uyje3dsxs",
"url": "https:example2.com",
"organization": "Metro",
"val": "valid"
},
{
"task_id": "ghs563vt6",
"url": "https:example1.com",
"organization": "Avengers",
"val": "invalid"
},
{
"task_id": "erf6egy64",
"url": "https:example2.com",
"organization": "Metro",
"val": "null"
}
]
我正在尝试创建一个 mongodb 聚合函数,以便它会产生类似
的结果[
{
"Metro": {
"invalid": 0,
"null": 1,
"valid": 1,
"url": "https:example2.com"
},
},
{
"Avengers": {
"invalid": 1,
"null": 1,
"valid": 1,
"url": "https:example1.com"
}
}
]
我从 Whosebug 得到了很多帮助才能到达这里。
我需要重新格式化从聚合器接收到的数据,以便它产生上述结果。目前的聚合脚本是
db.collection.aggregate([ {"$group": {"_id": {"k": "$organization","v": "$val"},"cnt": {"$sum": 1},"url": {$first: "$url"}}},
{"$project": {"_id": 0, "url": 1, "k": "$_id.k", "o": {"k": "$_id.v", "v": "$cnt"}}},
{"$group": {"_id": "$k", "v": { "$push": "$o"}, "url": {"$first": "$url"}}},
{"$addFields": {"v": {"$mergeObjects": [{"null": 0,"valid": 0,"invalid": 0},{"$arrayToObject": "$v"}]}}},
{"$project": {"_id": 0, "url": 1, "new": [{"k": "$_id","v": "$v"}]}},
{"$addFields": {"new": {"$mergeObjects": [{"$arrayToObject": "$new"},{"url": "$url"}]}}},
{"$replaceRoot": {"newRoot": "$new"}} ])
您可以尝试此查询以避免多个 $group
(作为权衡,您有三个 $filter
,但我认为这仍然比多个 $group
好):
此查询按organization
分组,然后使用$project
输出存在多少个“valid”、“invalid”和“null”的大小。
编辑:您还可以添加一个额外的步骤$replaceRoot
以获得与您想要的完全相同的输出。
db.collection.aggregate([
{
"$group": {
"_id": "$organization",
"val": {
"$push": "$val"
},
"url": {
"$first": "$url"
}
}
},
{
"$project": {
"_id": 0,
"organization": [
{
"k": "$_id",
"v": {
"url": "$url",
"invalid": {
"$size": {
"$filter": {
"input": "$val",
"cond": {
"$eq": [
"$$this",
"invalid"
]
}
}
}
},
"valid": {
"$size": {
"$filter": {
"input": "$val",
"cond": {
"$eq": [
"$$this",
"valid"
]
}
}
}
},
"null": {
"$size": {
"$filter": {
"input": "$val",
"cond": {
"$eq": [
"$$this",
"null"
]
}
}
}
}
}
}
]
}
},
{
"$replaceRoot": {
"newRoot": {
"$arrayToObject": "$organization"
}
}
}
])
示例here