有条件的分组和计数
Group and count with condition
我正在尝试对一组文档进行分组并根据它们的值对它们进行计数:
{ item: "abc1", value: 1 }
{ item: "abc1", value: 1 }
{ item: "abc1", value: 11 }
{ item: "xyz1", value: 2 }
我想按 item
分组并在 return 中计算 value
比 10
大多少倍和小多少倍:
{ item: "abc1", countSmaller: 2, countBigger: 1 }
{ item: "xyz1", countSmaller: 1, countBigger: 0 }
您需要使用 $cond
运算符。这里 0
是小于 10
的值,1
是大于 10
的值。这并不完全给你预期的输出。也许有人会 post 更好地回答。
db.collection.aggregate(
[
{
"$project":
{
"item": 1,
"value":
{
"$cond": [ { "$gt": [ "$value", 10 ] }, 1, 0 ]
}
}
},
{
"$group":
{
"_id": { "item": "$item", "value": "$value" },
"count": { "$sum": 1 }
}
},
{
"$group":
{
"_id": "$_id.item",
"stat": { "$push": { "value": "$_id.value", "count": "$count" }}
}
}
]
)
输出:
{
"_id" : "abc1",
"stat" : [
{
"value" : 1,
"count" : 2
},
{
"value" : 0,
"count" : 2
}
]
}
{ "_id" : "xyz1", "stat" : [ { "value" : 0, "count" : 1 } ] }
您需要 convert 您的价值 integer
或 float
你需要的是聚合框架的$cond
算子。获得所需内容的一种方法是:
db.foo.aggregate([
{
$project: {
item: 1,
lessThan10: { // Set to 1 if value < 10
$cond: [ { $lt: ["$value", 10 ] }, 1, 0]
},
moreThan10: { // Set to 1 if value > 10
$cond: [ { $gt: [ "$value", 10 ] }, 1, 0]
}
}
},
{
$group: {
_id: "$item",
countSmaller: { $sum: "$lessThan10" },
countBigger: { $sum: "$moreThan10" }
}
}
])
注意:我假设 value
为数字而不是字符串。
输出:
{
"result" : [
{
"_id" : "xyz1",
"countSmaller" : 1,
"countBigger" : 0
},
{
"_id" : "abc1",
"countSmaller" : 2,
"countBigger" : 2
}
],
"ok" : 1
}
如果有人正在寻找此场景的 Java 代码(根据我的需要更新字段):
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.project("environment").and("success").applyCondition(ConditionalOperators.when(Criteria.where("deploymentStatus").is("SUCCESS"))
.then(1)
.otherwise(0)).and("failed").applyCondition(ConditionalOperators.when(Criteria.where("deploymentStatus").is("FAILURE"))
.then(1)
.otherwise(0)),
Aggregation.group("environment").sum("success").as("success").sum("failed").as("failed"));
我正在尝试对一组文档进行分组并根据它们的值对它们进行计数:
{ item: "abc1", value: 1 }
{ item: "abc1", value: 1 }
{ item: "abc1", value: 11 }
{ item: "xyz1", value: 2 }
我想按 item
分组并在 return 中计算 value
比 10
大多少倍和小多少倍:
{ item: "abc1", countSmaller: 2, countBigger: 1 }
{ item: "xyz1", countSmaller: 1, countBigger: 0 }
您需要使用 $cond
运算符。这里 0
是小于 10
的值,1
是大于 10
的值。这并不完全给你预期的输出。也许有人会 post 更好地回答。
db.collection.aggregate(
[
{
"$project":
{
"item": 1,
"value":
{
"$cond": [ { "$gt": [ "$value", 10 ] }, 1, 0 ]
}
}
},
{
"$group":
{
"_id": { "item": "$item", "value": "$value" },
"count": { "$sum": 1 }
}
},
{
"$group":
{
"_id": "$_id.item",
"stat": { "$push": { "value": "$_id.value", "count": "$count" }}
}
}
]
)
输出:
{
"_id" : "abc1",
"stat" : [
{
"value" : 1,
"count" : 2
},
{
"value" : 0,
"count" : 2
}
]
}
{ "_id" : "xyz1", "stat" : [ { "value" : 0, "count" : 1 } ] }
您需要 convert 您的价值 integer
或 float
你需要的是聚合框架的$cond
算子。获得所需内容的一种方法是:
db.foo.aggregate([
{
$project: {
item: 1,
lessThan10: { // Set to 1 if value < 10
$cond: [ { $lt: ["$value", 10 ] }, 1, 0]
},
moreThan10: { // Set to 1 if value > 10
$cond: [ { $gt: [ "$value", 10 ] }, 1, 0]
}
}
},
{
$group: {
_id: "$item",
countSmaller: { $sum: "$lessThan10" },
countBigger: { $sum: "$moreThan10" }
}
}
])
注意:我假设 value
为数字而不是字符串。
输出:
{
"result" : [
{
"_id" : "xyz1",
"countSmaller" : 1,
"countBigger" : 0
},
{
"_id" : "abc1",
"countSmaller" : 2,
"countBigger" : 2
}
],
"ok" : 1
}
如果有人正在寻找此场景的 Java 代码(根据我的需要更新字段):
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.project("environment").and("success").applyCondition(ConditionalOperators.when(Criteria.where("deploymentStatus").is("SUCCESS"))
.then(1)
.otherwise(0)).and("failed").applyCondition(ConditionalOperators.when(Criteria.where("deploymentStatus").is("FAILURE"))
.then(1)
.otherwise(0)),
Aggregation.group("environment").sum("success").as("success").sum("failed").as("failed"));