我有很多文档-每个文档都有一个日期字段,每个文档都有不同的键....(嗯,它们各不相同...这就是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"
}
}
}
]
);
但是,我不确定性能如何?
答案 0 :(得分:1)
您可以使用$group
$dateToString
,然后只需将$$ROOT
元素$push
this issue report到数组
db.collection.aggregate([
{ "$group": {
"_id": {
"$dateToString": {
"format": "%Y-%m-%d",
"date": "$date"
}
},
"data": {
"$push": "$$ROOT"
}
}}
])