我在 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"
}
}
]
我從 stackoverflow 獲得了很多幫助才能到達這里。
我需要重新格式化從聚合器接收到的資料,以便它產生上述結果。目前的聚合腳本是
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"}} ])
uj5u.com熱心網友回復:
您可以嘗試使用此查詢來避免多重$group(作為權衡,您有三個$filter,但我認為這仍然比多重好$group):
這個查詢 group byorganization然后使用$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"
}
}
}
])
這里的例子
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/453630.html
