Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于过去日期的Mongodb聚合_Javascript_Mongodb_Aggregation Framework - Fatal编程技术网

Javascript 基于过去日期的Mongodb聚合

Javascript 基于过去日期的Mongodb聚合,javascript,mongodb,aggregation-framework,Javascript,Mongodb,Aggregation Framework,我试图在Mongodb中执行查询。我要执行的查询是根据日期(过去7天)查找集合中的所有订单,然后使用每个订单的嵌套对象将价格相加。到目前为止,我有以下代码: 收集/数据 { "_id" : "g32fYpydfSFDbFkoi", "orderNumber" : 1234, "createdAt" : ISODate("2016-01-12T13:50:17.559Z"), "productsInOrder" : [ { "

我试图在Mongodb中执行查询。我要执行的查询是根据日期(过去7天)查找集合中的所有订单,然后使用每个订单的嵌套对象将价格相加。到目前为止,我有以下代码:

收集/数据

{
    "_id" : "g32fYpydfSFDbFkoi",
    "orderNumber" : 1234,
    "createdAt" : ISODate("2016-01-12T13:50:17.559Z"),
    "productsInOrder" : [
        {
            "category" : "ambient",
            "item" : 23982,
            "desc" : "Ergonomic Cotton Sausages",
            "quantity" : "456",
            "price" : "0.54",
            "lineprice" : "246.24",
            "_id" : "BdD4QnM7sYTwBpLds"
        },
        {
            "category" : "ambient",
            "item" : 15336,
            "desc" : "Rustic Wooden Chicken",
            "quantity" : "2",
            "price" : "1.87",
            "lineprice" : "3.74",
            "_id" : "PvtSxi2MfYrZNTD6f"
        },
        {
            "category" : "chilled",
            "item" : 57584,
            "desc" : "Unbranded Soft Chicken",
            "quantity" : "3",
            "price" : "4.69",
            "lineprice" : "14.07",
            "_id" : "ppkECqmhPvg7pQcgB"
        },
        {
            "category" : "ambient",
            "item" : 71168,
            "desc" : "Rustic Rubber Computer",
            "quantity" : "5",
            "price" : "3.04",
            "lineprice" : "15.20",
            "_id" : "bZtr5dkvsG92YtLoe"
        },
        {
            "category" : "frozen",
            "item" : 87431,
            "desc" : "Unbranded Granite Sausages",
            "quantity" : "5678",
            "price" : "1.98",
            "lineprice" : "11242.44",
            "_id" : "ZKur3rHhtCLsWiENr"
        },
        {
            "category" : "frozen",
            "item" : 75007,
            "desc" : "Practical Frozen Towels",
            "quantity" : "678",
            "price" : "1.19",
            "lineprice" : "806.82",
            "_id" : "g78zvzoE8wJkciD9C"
        },
        {
            "category" : "frozen",
            "item" : 84721,
            "desc" : "Fantastic Metal Hat",
            "quantity" : "34",
            "price" : "1.83",
            "lineprice" : "62.22",
            "_id" : "4aqxBWhXy5cabbbiM"
        },
        {
            "category" : "frozen",
            "item" : 72240,
            "desc" : "Fantastic Granite Towels",
            "quantity" : "1",
            "price" : "2.94",
            "lineprice" : "2.94",
            "_id" : "MQD2LNv36mE3BWvZJ"
        },
        {
            "category" : "chilled",
            "item" : 89448,
            "desc" : "Intelligent Concrete Towels",
            "quantity" : "6678",
            "price" : "0.42",
            "lineprice" : "2804.76",
            "_id" : "AjRrxFT4mfpxuciC4"
        },
        {
            "category" : "chilled",
            "item" : 57584,
            "desc" : "Unbranded Soft Chicken",
            "quantity" : "1111",
            "price" : "4.69",
            "lineprice" : "5210.59",
            "_id" : "4yBspve6mBNNzqDnZ"
        }
    ]
  }
质疑

我最终想要的是输出过去7天每天的总价格。有人能帮我指出正确的方向吗?非常感谢。

首先,运算符将忽略非数字值,
productsInOrder.price
子文档字段为字符串类型,因此最好将其转换为数字字段

完成此操作后,要输出过去7天内每天的总价格,请将group by key更改为使用操作符,该操作符可在该7天范围内每天对文档进行分组,如下所示

Orders.aggregate([
    { "$match": { "createdAt": { "$gt": pastDate } } },
    { "$unwind": "$productsInOrder" },
    {
        "$group": {
            "_id": {
                "day": { "$dayOfMonth": "$createdAt" }
            },
            "price": { "$sum": "$productsInOrder.price" }
        }
    }    
]);

你知道你的
price
字段是一个字符串吗?@chridam不,我没有!谢谢你指出这一点out@chridam现在我已经纠正了这个问题,我可以得到所有价格的总和,所以感谢指针。有没有一种方法可以分别输出过去7天的总数,或者我必须为每个条件运行多个查询?没有,您不必为每个条件运行多个查询,只需更改group by键以使用运算符
\u id:{day:{$dayOfMonth:createdAt}
在这7天的范围内,每天将哪些文档分组。@chridam谢谢你,我开始很好地理解这一点了,谢谢你的评论。如果你想把这作为答案,我给你打分。
Orders.aggregate([
    { "$match": { "createdAt": { "$gt": pastDate } } },
    { "$unwind": "$productsInOrder" },
    {
        "$group": {
            "_id": {
                "day": { "$dayOfMonth": "$createdAt" }
            },
            "price": { "$sum": "$productsInOrder.price" }
        }
    }    
]);