如何在猫鼬中按日期分组?

时间:2021-02-27 09:09:48

标签: node.js express mongoose

我想按日期对此类数据进行分组。 我已经填充了数组,但我不知道在哪里聚合猫鼬数据

这是我的示例 mongo 数据

[{
        "_id": "602badd505335124d77c07eb",
        "createTime": "2021-02-06T14:38:49.000Z",
        "services": [{
                "service_id": "602bad6105335124d77c07ea",
                "service_type": "Normal",
                "service_name": "Water",
                "price": 230
            },
            {
                "service_id": "602bad6105335124d77c07ea",
                "service_type": "Normal",
                "service_name": "Water",
                "price": 234
            }
        ],
        "items": [
            null,
            null
        ],
        "total_amount": 16000
    },
    {
        "_id": "602badfe05335124d77c07f0",
        "createTime": "2021-02-07T14:38:49.000Z",
        "services": [{
                "service_id": "602bad6105335124d77c07ea",
                "service_type": "Normal",
                "service_name": "Water",
                "price": 230
            },
            {
                "service_id": "602bad6105335124d77c07ea",
                "service_type": "Normal",
                "service_name": "Water",
                "price": 234
            }
        ],
        "items": [
            null,
            null
        ],
        "total_amount": 16000
    },
    {
        "_id": "602badfe05335124d77c07f3",
        "createTime": "2021-02-07T14:38:49.000Z",
        "services": [{
                "service_id": "602bad6105335124d77c07ea",
                "service_type": "Normal",
                "service_name": "Water",
                "price": 230
            },
            {
                "service_id": "602bad6105335124d77c07ea",
                "service_type": "Normal",
                "service_name": "Water",
                "price": 234
            }
        ],
        "items": [
            null,
            null
        ],
        "total_amount": 16000
    },
    {
        "_id": "602bae8705335124d77c07f5",
        "createTime": "2021-02-08T14:38:49.000Z",
        "services": [{
                "service_id": "602bad6105335124d77c07ea",
                "service_type": "Normal",
                "service_name": "Water",
                "price": 230
            },
            {
                "service_id": "602bad6105335124d77c07ea",
                "service_type": "Normal",
                "service_name": "Water",
                "price": 234
            }
        ],
        "items": [],
        "total_amount": 16000
    }
]

这是我用来产生结果的当前代码。如您所见,我正在填充两个对象。我想要做的是我想按日期返回一个数组组(createdTime)

router
  .route("/")
  .get((req, res) => {
    const match = {
      shop_id: req.params.shop_id,
    };
    let beforeString, afterString, params, date, filter_by;

    params = req.query
    filter_by = params.filter_by
    date = new Date(params.date)
    if (filter_by =="date"){
      beforeString = date
      afterString = new Date(date.getTime() + 86400000) 
    }
    
    match.createdAt = {
      $gte: moment(beforeString, "YYYY/MM/DD"),
      $lt: moment(afterString, "YYYY/MM/DD"),
    };

    Income.find(match)
      .populate("services.service_id")
      .populate("items.item_id")
      .then((result) => {
        res.status(200).json(result);
      }).catch((err) => res.status(400).json("error" + err));
  });

我想要的实际结果是这样的,

{
    "2021-02-06": [{
        "_id": "602badd505335124d77c07eb",
        "createTime": "2021-02-06T14:38:49.000Z",
        "services": [{
                "service_id": "602bad6105335124d77c07ea",
                "service_type": "Normal",
                "service_name": "Water",
                "price": 230
            },
            {
                "service_id": "602bad6105335124d77c07ea",
                "service_type": "Normal",
                "service_name": "Water",
                "price": 234
            }
        ],
        "items": [
            null,
            null
        ],
        "total_amount": 16000
    }],
    "2021-02-07": [{
            "_id": "602badfe05335124d77c07f0",
            "createTime": "2021-02-07T14:38:49.000Z",
            "services": [{
                    "service_id": "602bad6105335124d77c07ea",
                    "service_type": "Normal",
                    "service_name": "Water",
                    "price": 230
                },
                {
                    "service_id": "602bad6105335124d77c07ea",
                    "service_type": "Normal",
                    "service_name": "Water",
                    "price": 234
                }
            ],
            "items": [
                null,
                null
            ],
            "total_amount": 16000
        },
        {
            "_id": "602badfe05335124d77c07f3",
            "createTime": "2021-02-07T14:38:49.000Z",
            "services": [{
                    "service_id": "602bad6105335124d77c07ea",
                    "service_type": "Normal",
                    "service_name": "Water",
                    "price": 230
                },
                {
                    "service_id": "602bad6105335124d77c07ea",
                    "service_type": "Normal",
                    "service_name": "Water",
                    "price": 234
                }
            ],
            "items": [
                null,
                null
            ],
            "total_amount": 16000
        }
    ]
}

2 个答案:

答案 0 :(得分:0)

  • 本机排序:-
const arr = await Income.find(match).populate("services.service_id").populate("items.item_id");

const sortedArray = arr.sort((a, b) => a.createTime - b.createTime); // inc order
const sortedArray2 = arr.sort((a, b) => b.createTime - a.createTime); // dec order

答案 1 :(得分:0)

您可以通过 aggregation pipeline 来实现这一目标 $match 按日期过滤器的所有相关文档,然后按 $group 字段的日期 createTime 您的文档,最后按组的每个 {{1} }.

$sort

以下是 mongoplayground 的简化工作示例:https://mongoplayground.net/p/AKFWBlMu5P5