【问题标题】:MongoDB Match DATE between FAILS失败之间的 MongoDB 匹配日期
【发布时间】: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


【解决方案1】:

这里的问题与 Date 上的匹配无关,它可以正常工作。问题是每条记录都有一个会议数组,每个会议都有不同的日期,所以即使匹配正确的日期,聚合的其余部分,展开等......将使用所有会议的完整记录,这就是为什么我获取不同的日期。

在这里,我在 $ReplaceRoot 之后添加了一个额外的 Match 并工作......也可以在聚合的某些部分使用 $filter..

干杯

【讨论】:

    猜你喜欢
    • 2016-02-26
    • 1970-01-01
    • 2019-01-24
    • 2013-09-19
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    相关资源
    最近更新 更多