我有一个像
这样的文件 {
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
如果日期扩展,可以通过简单聚合完成。是否可以扩展聚合的日期范围?
编辑:基本上对于给定的范围我想扩展该范围并得到每天的计数,除非它与另一个范围重叠,否则它将是一个。
答案 0 :(得分: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"
}
]
}
]
现在如果您想要计算所有start
日期,那么只需使用以下查询
db.collectionName.aggregate([
{
"$unwind": "$b"
},
{
"$group": {
"_id": "$b.start",
"count": {
"$sum": 1
}
}
},
{
"$project": {
"startDate": "$_id",
"count": "$count",
"_id": 0
}
}
])
以上用于结束日期的内容只需在组中替换 $b.start to $b.end
然后显示结束日期计数
如果您想从给定范围中找出start
日期计数,然后使用以下查询,请假设start
来自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
}
}
])