问题描述
我已经使用MongoDB仅仅一个星期了,但在实现此结果方面遇到了一些问题:我想按日期对文档进行分组,同时还要跟踪将某个字段设置为某个值的条目数。 / p>
所以,我的文档如下:
{
"_id" : ObjectId("5f3f79fc266a891167ca8f65"),"recipe" : "A","timestamp" : ISODate("2020-08-22T09:38:36.306Z")
}
其中配方为“ A”,“ B”或“ C”。现在,我使用以下pymongo查询按日期对文档进行分组:
mongo.db.aggregate(
# Pipeline
[
# Stage 1
{
"$project": {
"createdAt": {
"$datetoString": {
"format": "%Y-%m-%d","date": "$timestamp"
}
},"progressivo": 1,"temperatura_fusione": 1
}
},# Stage 2
{
"$group": {
"_id": {
"createdAt": "$createdAt"
},"products": {
"$sum": 1
}
}
},# Stage 3
{
"$project": {
"label": "$_id.createdAt","value": "$products","_id": 0
}
}])
哪个给我这样的结果:
[{"label": "2020-08-22","value": 1},{"label": "2020-08-15","value": 2},{"label": "2020-08-11",{"label": "2020-08-21","value": 5}]
我还想计算每个食谱在每个日期出现多少次。因此,例如,如果在8月21日,我有2个输入为“ A”配方,3个为“ B”配方,0个为“ C”配方,则所需的输出为
{"label": "2020-08-21","value": 5,"A": 2,"B":3,"C":0}
您有什么建议吗?
谢谢!
解决方法
您可以喜欢以下内容,您所做的很棒。之后,
- 在第二个分组中,我们只获得总价值和每个食谱的价值。
-
$map
用于浏览/修改每个对象 -
$arrayToObject
用于将我们通过映射(键:值对)映射到对象所做的操作隐蔽到数组 -
$ifNull
用于,有时您的数据可能没有“ A” 或“ B” 或“ C” 。但是,如果没有名称作为预期输出,则需要将值设置为 0 。
这是代码
[
{
"$project": {
"createdAt": {
"$dateToString": {
"format": "%Y-%m-%d","date": "$timestamp"
}
},recipe: 1,"progressivo": 1,"temperatura_fusione": 1
}
},{
"$group": {
"_id": {
"createdAt": "$createdAt","recipeName": "$recipe",},"products": {
$sum: 1
}
}
},{
"$group": {
"_id": "$_id.createdAt",value: {
$sum: "$products"
},recipes: {
$push: {
name: "$_id.recipeName",val: "$products"
}
}
}
},{
$project: {
"content": {
"$arrayToObject": {
"$map": {
"input": "$recipes","as": "el","in": {
"k": "$$el.name","v": "$$el.val"
}
}
}
},value: 1
}
},{
$project: {
_id: 1,value: 1,A: {
$ifNull: [
"$content.A",0
]
},B: {
$ifNull: [
"$content.B",C: {
$ifNull: [
"$content.C",0
]
}
}
}
]