gpt4 book ai didi

python - 根据字段值有条件地分组总计

转载 作者:太空宇宙 更新时间:2023-11-03 15:09:23 27 4
gpt4 key购买 nike

我正在尝试通过 pymongo 从 MongoDB 查询不同的文档,并按特定字段对它们进行分组。分组部分工作得很好,但我有一个具有 bool 值(True、False)的字段,但目前它将 True 文档和 False 文档保存在单独的分组中。

例如:

doc1{boolean : True, ... ... ..., count = 20}
doc2{boolean : False, ... ... ..., count = 10}

但我需要它像这样分组:

doc{boolTrue : 20, boolFalse, 10, ... ... ..., count = 30}

这样就不会用 bool 字段分隔文档。

我尝试做类似的事情,但是建议的(见下文)解决方案都不起作用:

"$group": {
"_id": {
"succTrue": {"$sum": {"$cond": [{"$client.succeeded": "True"}, 1, 0]}},
"succFalse": {"$cond": [{"$client.succeeded": "False"}, 1, 0]},
}
}

PS:还有其他字段,但它们与问题无关。

E:实际文档看起来像这样:

{
"sType" : "Client",
"succeeded" : false,
"sVer" : "v1"
}

预期输出:

{
countSucceededTrue: 15,
countSucceededFalse: 5,
"sType" : "Client",
"sVer" : "v1"
},
{
countSucceededTrue: 5,
countSucceededFalse: 13,
"sType" : "Client",
"sVer" : "v2"
}
{
countSucceededTrue: 3,
countSucceededFalse: 2,
"sType" : "Client",
"sVer" : "v3"
}

最佳答案

您希望在 _id 字段中设置“分组键”,并在 $sum 下设置其他条件累加器:

collection.aggregate([
{ "$group": {
"_id": { "sType": "$sType", "sVer": "$sVer" },
"countSucceededTrue": { "$sum": { "$cond": [ "$succeeded", 1, 0 ] } },
"countSucceededFalse": { "$sum": { "$cond": [ "$succeeded", 0, 1 ] } }
}}
])

“分组键”当然是嵌套的,但您应该习惯这个概念。可以进行另一遍重命名字段 $project ,但成本贯穿所有结果,而不仅仅是接受这些结果嵌套在 _id 中:

collection.aggregate([
{ "$group": {
"_id": { "sType": "$sType", "sVer": "$sVer" },
"countSucceededTrue": { "$sum": { "$cond": [ "$succeeded", 1, 0 ] } },
"countSucceededFalse": { "$sum": { "$cond": [ "$succeeded", 0, 1 ] } }
}},
{ "$project": {
"sType": "$_id.sType",
"sVer": "$_id.sVer",
"countSucceededTrue": 1,
"countSucceededFalse": 1
}}
])

$cond"ternary" ,因此,如果第一个条件“if”在逻辑上为真(并且它已经是 bool 值),“则”使用第二个参数“else”使用第三个参数的值。这将“计数”提供给 $sum累加器。

关于python - 根据字段值有条件地分组总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44354754/

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