如何用JavaScript生成MongoDB删除一年前记录的日期查询条件
Ah, I see the issue with your code—you're trying to call Date methods like setFullYear() on a string, which won't work because strings don't have those methods. Let's break down how to fix this properly.
First: Fixing the Date Formatting Code
The key mistake is that you converted the Date to a string too early. You need to manipulate the Date object first, then convert it to the required string format. Here's the corrected code:
// Create a Date object for the current time const currentDate = new Date(); // Subtract one year from the date object (handles leap years automatically) currentDate.setFullYear(currentDate.getFullYear() - 1); // Convert to UTC string, then remove the day prefix (e.g., "Wed, ") to match your database format const oneYearAgoStr = currentDate.toUTCString().slice(5); console.log(oneYearAgoStr); // Outputs something like "20 Sep 2022 12:34:56 GMT"
Second: Using This in a MongoDB Delete Query
With the formatted string, you can build your delete query. However, warning: comparing dates stored as strings in this format can lead to unexpected results. For example, "01 Mar 2023" would be lex order less than "31 Jan 2023" because "01" < "31", even though March is later than January.
A more reliable approach is to use MongoDB's $dateFromString operator to parse the stored string into an actual Date object, then compare it to a Date object representing one year ago. This avoids string comparison issues:
// Create the one-year-ago Date object (same as before) const oneYearAgo = new Date(); oneYearAgo.setFullYear(oneYearAgo.getFullYear() - 1); // MongoDB delete query using aggregation expressions db.yourCollection.deleteMany({ $expr: { $lt: [ // Parse the stored string date into a Date object { $dateFromString: { dateString: "$yourDateField", format: "%d %b %Y %H:%M:%S GMT" } }, // Compare to our one-year-ago Date object oneYearAgo ] } });
The format parameter in $dateFromString matches your database's date format:
%d: Two-digit day%b: Three-letter month abbreviation (e.g., Feb, Mar)%Y: Four-digit year%H:%M:%S: Hours, minutes, secondsGMT: The literal "GMT" suffix
This approach ensures accurate date comparisons, even for edge cases like leap years or month/day order.
内容的提问来源于stack exchange,提问作者user9067671

