gpt4 book ai didi

mongodb - 在 mongodb 中生成日期范围

转载 作者:可可西里 更新时间:2023-11-01 09:15:13 25 4
gpt4 key购买 nike

我有这样的文档,

    {
a : "123",
b : [
{
"start" : "2015-01-03",
"end" : "2015-01-05",
"name" : "xyz"
},
{
"start" : "2015-01-15",
"end" : "2015-01-17",
"name" : "abc"
}
]
},
{
a : "456",
b : [
{
"start" : "2015-01-04",
"end" : "2015-01-05",
"name" : "xyzd"
}
]
}

我正在尝试获取每天 b 的计数,例如,

2015-01-03 count: 1
2015-01-04 count: 2
2015-01-05 count: 2
2015-01-15 count: 1
2015-01-16 count: 1
2015-01-17 count: 1

如果日期被扩展,这可以通过简单的聚合来完成。是否可以扩展聚合的日期范围?

编辑:基本上对于给定的范围,我想扩展该范围并获取每天的计数,除非它与另一个范围重叠,否则它将是一个。

最佳答案

让我们检查以下场景,如果您的文档日期像下面给出的 ISODate 格式

[
{
"_id": ObjectId("552e71ec3420d7797e5ae682"),
"a": "123",
"b": [
{
"start": ISODate("2015-01-03T00:00:00Z"),
"end": ISODate("2015-01-05T00:00:00Z"),
"name": "xyz"
},
{
"start": ISODate("2015-01-15T00:00:00Z"),
"end": ISODate("2015-01-17T00:00:00Z"),
"name": "abc"
}
]
},
{
"_id": ObjectId("552e72063420d7797e5ae683"),
"a": "456",
"b": [
{
"start": ISODate("2015-01-04T00:00:00Z"),
"end": ISODate("2015-01-05T00:00:00Z"),
"name": "xyzd"
}
]
}
]

现在如果你想计算所有的开始日期然后简单使用下面的查询

db.collectionName.aggregate([
{
"$unwind": "$b"
},
{
"$group": {
"_id": "$b.start",
"count": {
"$sum": 1
}
}
},
{
"$project": {
"startDate": "$_id",
"count": "$count",
"_id": 0
}
}
])

同样用于结束日期,只需在组中替换 $b.start 到 $b.end 然后它显示结束日期计数

现在另一个问题是,如果您想从给定范围内找出开始 日期计数,然后使用下面的查询,假设开始 日期来自ISODate("2015-01 -03T00:00:00Z")ISODate("2015-01-04T00:00:00Z") 范围

db.collectionName.aggregate([
{
"$unwind": "$b"
},
{
"$match": {
// check here date range matching documents
"$and": [
{
"b.start": {
"$gte": ISODate("2015-01-03T00:00:00Z")
}
},
{
"b.start": {
"$lte": ISODate("2015-01-04T00:00:00Z")
}
}
]
}
},
{
"$group": {
"_id": "$b.start",
"count": {
"$sum": 1
}
}
},
{
"$project": {
"startDate": "$_id",
"count": "$count",
"_id": 0
}
}
])

关于mongodb - 在 mongodb 中生成日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29649668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com