【发布时间】:2021-02-09 19:06:09
【问题描述】:
我有这样的比赛:
{
$and: [
{ $nor: [ { Meetings: { $exists: false } }, { Meetings: { $size: 0 } }, { Meetings: { $eq: null } } ] },
{ 'Meetings.MeetingDate': { $gte: ISODate("2020-12-23T00:00:01.000Z") } },
{ 'Meetings.MeetingDate': { $lte: ISODate("2020-12-23T23:59:59.999Z") } }
]
}
我在 2020 年 1 月 1 日到 2020 年 12 月 31 日在 Mongo 上开会。
如果我只想获得第 23 个,这场比赛会带来它们,但也会从更高的日期开始,如 25、26、30 等...
匹配日期 BETWEEN 以获得特定日期的正确方法是什么? (可以是一天或一个范围......)
这里有一个Mongo Playground 有一个小例子,但这里工作正常,我从 29 号开始。
我想我的问题出在我的聚合中。在示例中,我在根上添加了 MeetingDate,在现实生活中它是一个子数组,也许这就是问题所在。
db.getCollection("ClientProject").aggregate(
[
{
"$match" : {
"$and" : [
{
"$nor" : [
{
"Meetings" : {
"$exists" : false
}
},
{
"Meetings" : {
"$size" : 0.0
}
},
{
"Meetings" : {
"$eq" : null
}
}
]
},
{
"Meetings.MeetingDate" : {
"$gte" : ISODate("2020-12-30T00:00:01.000+0000")
}
},
{
"Meetings.MeetingDate" : {
"$lte" : ISODate("2020-12-31T23:59:59.999+0000")
}
}
]
}
},
{
"$project" : {
"ProjectName" : 1.0,
"ClientName" : 1.0,
"ClientResponsableName" : "$CreatedByName",
"ProjectType" : 1.0,
"ProjectSKU" : 1.0,
"Meetings" : 1.0
}
},
{
"$unwind" : {
"path" : "$Meetings",
"preserveNullAndEmptyArrays" : false
}
},
{
"$unwind" : {
"path" : "$Meetings.Invites",
"preserveNullAndEmptyArrays" : false
}
},
{
"$addFields" : {
"Meetings.Invites.MeetingDate" : "$Meetings.MeetingDate",
"Meetings.Invites.MeetingStartTime" : "$Meetings.StartTime",
"Meetings.Invites.MeetingEndTime" : "$Meetings.EndTime",
"Meetings.Invites.MeetingStatus" : "$Meetings.MeetingStatus",
"Meetings.Invites.ProjectId" : {
"$toString" : "$_id"
},
"Meetings.Invites.ProjectType" : "$ProjectType",
"Meetings.Invites.ProjectSKU" : "$ProjectSKU",
"Meetings.Invites.ProjectName" : "$ProjectName",
"Meetings.Invites.ClientId" : "$ClientId",
"Meetings.Invites.ClientName" : "$ClientName",
"Meetings.Invites.ClientResponsableName" : "$ClientResponsableName"
}
},
{
"$replaceRoot" : {
"newRoot" : "$Meetings.Invites"
}
},
{
"$sort" : {
"MeetingDate" : 1.0,
"MeetingStartTime" : 1.0,
"InviteStatus" : 1.0
}
}
],
{
"allowDiskUse" : false
}
);
干杯
【问题讨论】:
-
将您正在使用的数据添加到问题中。
-
你需要举一些例子来说明你想匹配什么,你不匹配什么。
-
刚刚更新了问题。我认为问题出在我的聚合匹配中。一个简单的匹配就可以了。
-
从查询中猜测,
Mettings是一个数组?如果是这样,您可能需要将日期检查包含在elemMatch -
你可以把匹配写得更短:
{ "$match" : { "Meetings.MeetingDate": { "$gte" : ISODate("2020-12-30T00:00:01.000+0000"), "$lte" : ISODate("2020-12-31T23:59:59.999+0000") } } }
标签: mongodb mongodb-query