想要匹配嵌入字段和 return 个不同的记录
Want to match embedded field and return distinct records
我有一个集合,每年存储如下文档。在假期数组中,它存储 holiday_date,其中有日期和假期。现在一个约会可以有 2 个假期。就像它可以是星期天,也可以是排灯节。我想要的是查找特定年份和月份的不同记录数。更具体地说,我想传递 year 和 month ,传递的年份将与 "year" 字段进行比较,传递的月份将与 "holiday_date" 字段的月份进行比较,并且只会给我们不同的记录(每个日期都是唯一的)。
{
"_id" : ObjectId("55276ffd203340d01483d2a7"),
"year" : "2015",
"holidays" : [
{
"holiday_date" : ISODate("2015-04-21T00:00:00.000Z"),
"event" : "diwali",
"weekday" : false,
"_id" : ObjectId("55279855a78a431805b94ae8")
},
{
"holiday_date" : ISODate("2015-04-28T00:00:00.000Z"),
"event" : "1212",
"weekday" : false,
"_id" : ObjectId("5527848042336d001cdae82b")
},
{
"holiday_date" : ISODate("2015-04-30T00:00:00.000Z"),
"event" : "fd",
"weekday" : false,
"_id" : ObjectId("55277c05c83d4d8813f94f14")
},
{
"holiday_date" : ISODate("2015-04-01T00:00:00.000Z"),
"event" : "xzcxc",
"weekday" : false,
"_id" : ObjectId("55277c05c83d4d8813f94f13")
},
{
"holiday_date" : ISODate("2015-04-30T00:00:00.000Z"),
"event" : "fd",
"weekday" : false,
"_id" : ObjectId("55277bdec83d4d8813f94f12")
},
{
"holiday_date" : ISODate("2015-04-30T00:00:00.000Z"),
"event" : "ssdds",
"weekday" : false,
"_id" : ObjectId("55277bd0c83d4d8813f94f11")
}
],
}
请使用以下代码段
db.stores.aggregate(
{ $unwind: '$holidays' },
{$match: {'year': "2015"}},
{$match: {
created_date : {
$gte:{'$holidays.holiday_date':'2015-04-01T04:00:00Z'},
$lt: {'$holidays.holiday_date':'2015-05-01T04:00:00Z'}
}
}},
{$group: {
'_id': {
'day': {'$dayOfMonth': '$holidays.holiday_date'},
'month': {'$month': '$holidays.holiday_date'},
'year': {'$year': '$holidays.holiday_date'},
'event': '$holidays.event'
},
count: { $sum: 1 },
ids: { $push: "$_id" }
}
}
)
您可以像下面这样设置月份
var startMonth = new Date("01,11,1992");
var endMonth = startMonth.setMonth(12);
谢谢
我有一个集合,每年存储如下文档。在假期数组中,它存储 holiday_date,其中有日期和假期。现在一个约会可以有 2 个假期。就像它可以是星期天,也可以是排灯节。我想要的是查找特定年份和月份的不同记录数。更具体地说,我想传递 year 和 month ,传递的年份将与 "year" 字段进行比较,传递的月份将与 "holiday_date" 字段的月份进行比较,并且只会给我们不同的记录(每个日期都是唯一的)。
{
"_id" : ObjectId("55276ffd203340d01483d2a7"),
"year" : "2015",
"holidays" : [
{
"holiday_date" : ISODate("2015-04-21T00:00:00.000Z"),
"event" : "diwali",
"weekday" : false,
"_id" : ObjectId("55279855a78a431805b94ae8")
},
{
"holiday_date" : ISODate("2015-04-28T00:00:00.000Z"),
"event" : "1212",
"weekday" : false,
"_id" : ObjectId("5527848042336d001cdae82b")
},
{
"holiday_date" : ISODate("2015-04-30T00:00:00.000Z"),
"event" : "fd",
"weekday" : false,
"_id" : ObjectId("55277c05c83d4d8813f94f14")
},
{
"holiday_date" : ISODate("2015-04-01T00:00:00.000Z"),
"event" : "xzcxc",
"weekday" : false,
"_id" : ObjectId("55277c05c83d4d8813f94f13")
},
{
"holiday_date" : ISODate("2015-04-30T00:00:00.000Z"),
"event" : "fd",
"weekday" : false,
"_id" : ObjectId("55277bdec83d4d8813f94f12")
},
{
"holiday_date" : ISODate("2015-04-30T00:00:00.000Z"),
"event" : "ssdds",
"weekday" : false,
"_id" : ObjectId("55277bd0c83d4d8813f94f11")
}
],
}
请使用以下代码段
db.stores.aggregate(
{ $unwind: '$holidays' },
{$match: {'year': "2015"}},
{$match: {
created_date : {
$gte:{'$holidays.holiday_date':'2015-04-01T04:00:00Z'},
$lt: {'$holidays.holiday_date':'2015-05-01T04:00:00Z'}
}
}},
{$group: {
'_id': {
'day': {'$dayOfMonth': '$holidays.holiday_date'},
'month': {'$month': '$holidays.holiday_date'},
'year': {'$year': '$holidays.holiday_date'},
'event': '$holidays.event'
},
count: { $sum: 1 },
ids: { $push: "$_id" }
}
}
)
您可以像下面这样设置月份
var startMonth = new Date("01,11,1992");
var endMonth = startMonth.setMonth(12);
谢谢