如何在 Mongodb 中获取条件字段
How to get conditional fields in Mongodb
你好开发者,
我是 MongoDB 的新手,正在尝试获取符合我要求的条件数据。
我有以下合集:
[
{
"id":10001,
"name":"Test 1",
"status":"live",
"traffics":[
{
"id":"1a3s5d435a4sd",
"status":"",
},
{
"id":"1a3s5d44as54d35a4sd",
"status":"CMP",
},
{
"id":"a3s5d454asd34asd",
"status":"",
},
{
"id":"1a35sd45a4sd34asd3",
"status":"TERM",
},
{
"id":"as35d435a4sd354as3d43asd4",
"status":"CMP",
},
{
"id":"135as4d5a4sd354a3s5d43asd",
"status":"CMP",
},
{
"id":"123as1d31a3d12ads13as",
"status":"TERM",
}
]
},
{...},{...}
]
我想获取这样的数据
ID, Name, count traffics as Starts, count (traffics where status = "CMP") as completes, count (traffics where status = "TERM") as Terminates, count (traffics where status = "") as Abandons
我正尝试运行遵循命令
db.inventory.aggregate( { $project: {id: 1, status: 1, starts: {$size: "$traffics"}, _id: 0}})
但我不知道如何在其中获取条件数据
我认为您可能需要运行 独立的聚合语句并使用 $match 语句。
$match: {
status: "CMP"
}
$match: {
status: "TERM"
}
$match: {
status: ""
}
试试这个代码。 $filter 运算符可从 Mongodb 3.2 版本开始使用。
db.inventory.aggregate( [
{ $project: {id: 1, status: 1, starts: {$size: "$traffics"},
completes:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,"CMP"]}}}},
terminates:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,"TERM"]}}}},
abandons:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,""]}}}},
_id: 0}
}
] )
希望对您有所帮助
我能够稍微修改@Yones 的回答,以便我可以根据条件获取记录数。
所以这是我对此的查询。
db.collection.aggregate({
$project: {
id: 1,
name: 1,
status: 1,
starts: {$size: "$traffics"},
completes: {
$size: {
$filter: {
input: "$traffics",
as: "item",
cond: {
$eq: [
"$$item.status",
"CMP"
]
}
}
}
},
terminates: {
$size: {
$filter: {
input: "$traffics",
as: "item",
cond: {
$eq: [
"$$item.status",
"TERM"
]
}
}
}
},
abandons: {
$size: {
$filter: {
input: "$traffics",
as: "item",
cond: {
$eq: [
"$$item.status",
""
]
}
}
}
},
_id: 0
}
})
我只是根据我的条件使用 $filter
过滤掉记录
然后我使用 $size 计算它的大小。
这是此答案的工作示例:https://mongoplayground.net/p/TcuLlJShclA
你好开发者,
我是 MongoDB 的新手,正在尝试获取符合我要求的条件数据。
我有以下合集:
[
{
"id":10001,
"name":"Test 1",
"status":"live",
"traffics":[
{
"id":"1a3s5d435a4sd",
"status":"",
},
{
"id":"1a3s5d44as54d35a4sd",
"status":"CMP",
},
{
"id":"a3s5d454asd34asd",
"status":"",
},
{
"id":"1a35sd45a4sd34asd3",
"status":"TERM",
},
{
"id":"as35d435a4sd354as3d43asd4",
"status":"CMP",
},
{
"id":"135as4d5a4sd354a3s5d43asd",
"status":"CMP",
},
{
"id":"123as1d31a3d12ads13as",
"status":"TERM",
}
]
},
{...},{...}
]
我想获取这样的数据
ID, Name, count traffics as Starts, count (traffics where status = "CMP") as completes, count (traffics where status = "TERM") as Terminates, count (traffics where status = "") as Abandons
我正尝试运行遵循命令
db.inventory.aggregate( { $project: {id: 1, status: 1, starts: {$size: "$traffics"}, _id: 0}})
但我不知道如何在其中获取条件数据
我认为您可能需要运行 独立的聚合语句并使用 $match 语句。
$match: {
status: "CMP"
}
$match: {
status: "TERM"
}
$match: {
status: ""
}
试试这个代码。 $filter 运算符可从 Mongodb 3.2 版本开始使用。
db.inventory.aggregate( [
{ $project: {id: 1, status: 1, starts: {$size: "$traffics"},
completes:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,"CMP"]}}}},
terminates:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,"TERM"]}}}},
abandons:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,""]}}}},
_id: 0}
}
] )
希望对您有所帮助
我能够稍微修改@Yones 的回答,以便我可以根据条件获取记录数。
所以这是我对此的查询。
db.collection.aggregate({
$project: {
id: 1,
name: 1,
status: 1,
starts: {$size: "$traffics"},
completes: {
$size: {
$filter: {
input: "$traffics",
as: "item",
cond: {
$eq: [
"$$item.status",
"CMP"
]
}
}
}
},
terminates: {
$size: {
$filter: {
input: "$traffics",
as: "item",
cond: {
$eq: [
"$$item.status",
"TERM"
]
}
}
}
},
abandons: {
$size: {
$filter: {
input: "$traffics",
as: "item",
cond: {
$eq: [
"$$item.status",
""
]
}
}
}
},
_id: 0
}
})
我只是根据我的条件使用 $filter
过滤掉记录然后我使用 $size 计算它的大小。
这是此答案的工作示例:https://mongoplayground.net/p/TcuLlJShclA