如何检查MongoDB文档中sessionDate是否在unavailableDates数组内
下面提供几种可行的实现方式:
1. 查询阶段直接筛选(推荐)
利用MongoDB的聚合表达式$expr结合$in操作符,在数据库层面直接筛选出符合条件的文档,效率更高。
const Admin = require('./path/to/adminModel'); // 查询所有sessionDate存在于自身unavailableDates数组中的管理员文档 Admin.find({ $expr: { $in: ['$sessionDate', '$unavailableDates'] } }) .then(matchedAdmins => { console.log('符合条件的文档:', matchedAdmins); }) .catch(error => { console.error('查询失败:', error); });
2. 获取文档后用JS判断
如果已经获取到单个Admin文档实例,可以通过JavaScript数组方法检查,注意要比较时间戳避免Date对象引用问题:
const Admin = require('./path/to/adminModel'); Admin.findById('6332d9846c4803d9ffc53bb0') .then(admin => { if (!admin) { console.log('未找到目标文档'); return; } // 比较时间戳判断日期是否匹配 const isUnavailable = admin.unavailableDates.some(date => date.getTime() === admin.sessionDate.getTime() ); console.log(`sessionDate是否在不可用日期列表中: ${isUnavailable}`); }) .catch(error => { console.error('查询失败:', error); });
3. 给Schema添加自定义实例方法
在Admin Schema中封装一个方法,方便后续重复调用:
const mongoose = require('mongoose'); const adminSchema = new mongoose.Schema({ sessionDate: { type: Date }, unavailableDates: { type: [Date] }, email: { type: String, required: true, min: 6, max: 255 }, password: { type: String, required: true, min: 6, max: 1024 } }); // 添加实例方法,判断当前文档的sessionDate是否在不可用日期中 adminSchema.methods.isSessionUnavailable = function() { // 处理sessionDate为null的情况 if (!this.sessionDate) return false; return this.unavailableDates.some(date => date.getTime() === this.sessionDate.getTime()); }; module.exports = mongoose.model('Admin', adminSchema);
使用该方法的示例:
const Admin = require('./path/to/adminModel'); Admin.findById('6332d9846c4803d9ffc53bb0') .then(admin => { if (!admin) { console.log('未找到目标文档'); return; } const result = admin.isSessionUnavailable(); console.log(`sessionDate是否在不可用日期列表中: ${result}`); }) .catch(error => { console.error('查询失败:', error); });
内容的提问来源于stack exchange,提问作者Alan Thomas
相关产品推荐
相关产品推荐

