我在燒瓶應用程式中使用 mongoengine 作為 ORM。模型類的定義如下
class MyData(db.Document):
task_id = db.StringField(max_length=50, required=True)
url = db.URLField(max_length=500,required=True,unique=True)
organization = db.StringField(max_length=250,required=True)
val = db.StringField(max_length=50, required=True)
欄位組織可以重復,我想獲得關于另一個欄位中值的重復計數。例如,如果 mongodb 中的資料是這樣的
[{"task_id":"as4d2rds5","url":"https:example1.com","organization":"Avengers","val":"null"},
{"task_id":"rfre43fed","url":"https:example2.com","organization":"Avengers","val":"valid"},
{"task_id":"uyje3dsxs","url":"https:example3.com","organization":"Metro","val":"valid"},
{"task_id":"ghs563vt6","url":"https:example4.com","organization":"Avengers","val":"invalid"},
{"task_id":"erf6egy64","url":"https:example5.com","organization":"Metro","val":"null"}]
然后我使用查詢所有物件
data = MyData.objects()
我想要一個像
[{"Avengers":{"valid":1,"null":1,"invalid":1}},{"Metro":{"valid":1,"null":1,"invalid":0}}]
我試過了
db.collection.aggregate([
{
"$group": {
"_id": "$organization",
"count": [
{
"null": {
"$sum": 1
},
"valid": {
"$sum": 1
},
"invalid": {
"$sum": 1
}
}
]
}
}
])
但我收到一個錯誤
The field 'count' must be an accumulator object
uj5u.com熱心網友回復:
也許是這樣的:
db.collection.aggregate([
{
"$group": {
"_id": {
k: "$organization",
v: "$val"
},
"cnt": {
$sum: 1
}
}
},
{
$project: {
_id: 0,
k: "$_id.k",
o: {
k: "$_id.v",
v: "$cnt"
}
}
},
{
$group: {
_id: "$k",
v: {
$push: "$o"
}
}
},
{
$addFields: {
v: {
"$arrayToObject": "$v"
}
}
},
{
$project: {
_id: 0,
new: [
{
k: "$_id",
v: "$v"
}
]
}
},
{
"$addFields": {
"new": {
"$arrayToObject": "$new"
}
}
},
{
"$replaceRoot": {
"newRoot": "$new"
}
}
])
解釋:
- 分組計數
- arrayToObject 專案
- 集團加入價值觀
- arrayToObject 再一次
- 額外專案
- arrayToObject 形成最終的物件
- 再做一次專案
- replaceRoot 將物件移動到根目錄。
PS請注意,如果缺失值不存在,此解決方案不會顯示缺失值,如果您需要缺失值,則需要添加額外的映射/合并物件
游樂場1
缺少值的選項(如果可能的值固定為 null、valid、invalid):只需將第二個 addFiedlds 替換為:
{
$addFields: {
v: {
"$mergeObjects": [
{
"null": 0,
valid: 0,
invalid: 0
},
{
"$arrayToObject": "$v"
}
]
}
}
}
游樂場2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/451199.html
標籤:Python mongodb 烧瓶 蒙哥引擎 烧瓶-mongoengine
