MongoDb按日期和分页分组

时间:2018-08-12 17:09:59

标签: node.js mongodb

我有很多文档-每个文档都有一个日期字段,每个文档都有不同的键....(嗯,它们各不相同...这就是mongo的本质)。

            {
                "_id" : ObjectId("5b5e5107b3218221345cb198"),
                "category" : "A",
                "type" : "toilet",
                "cleaned" : "yes",
                "date" : ISODate("2018-07-29T23:43:03.178+0000")
            }
            {
                "_id" : ObjectId("5b5e5119b3218221345cb199"),
                "category" : "B",
                "housed" : "no",
                "temp" : "44",
                "date" : ISODate("2018-08-10T10:22:22.774+0000")
            }

我正在尝试分组和分页。我需要能够按日期对所有文档进行分组-忽略时间。这样,我可以显示属于日期的所有文档。

当查看者单击下一个/上一个日期时,它会显示下一个/上一个日期等。因此,我还需要测试以查看下一个和上一个文档是否存在,以建立分页。

到目前为止,我的尝试失败了。我的想法是-我需要找到并分组,但这没有用。我阅读了此博客文章https://dzone.com/articles/aggregate-mongo-using-only并对其进行了修改-但这也行不通...它仅返回日期字段(datePartDay位将日期字符串拆分开了)

        db.getCollection("log").aggregate(
            {
                "$project":
                    {
                        _id: 0,
                        "datePartDay": {
                            "$concat": [
                                {"$substr": [{"$dayOfMonth": "$date"}, 0, 2]}, "-",
                                {"$substr": [{"$month": "$date"}, 0, 2]}, "-",
                                {"$substr": [{"$year": "$date"}, 0, 4]}
                            ]
                        }
                    }
            },
            {
                "$group":
                    {"date": "$datePartDay"}
            }
        )

我的应用程序正在节点上运行-我没有使用猫鼬。

**编辑**

@Anthony Winzlet

我无法使$ slice正常工作-但我可以将匹配项设置为仅在3天之内进行查找,因此将结果限制在3天之内。

db.collection.aggregate(
[
    { 
        "$match" : {
        // find the date range we want to look up
            "date" : {
                "$gte" : ISODate("2018-07-29T00:00:00.000+0000"),
                 "$lte" : ISODate("2018-09-10T00:00:00.000+0000")
            }
        }
    }, 
    { 
        "$group" : {
            "_id" : {
                "$dateToString" : {
                    "format" : "%Y-%m-%d", 
                    "date" : "$date"
                }
            }, 
            "data" : {
                "$push" : "$$ROOT"
            }
        }
    }
]
);

但是,我不确定性能如何?

1 个答案:

答案 0 :(得分:1)

您可以使用$group $dateToString,然后只需将$$ROOT元素$push this issue report到数组

db.collection.aggregate([
  { "$group": {
    "_id": {
      "$dateToString": {
        "format": "%Y-%m-%d",
        "date": "$date"
      }
    },
    "data": {
      "$push": "$$ROOT"
    }
  }}
])