使用变量作为嵌套文档键查询Mongoose Model的问题
解决Mongoose动态查询嵌套Schema字段的问题
这个问题我之前在项目里也碰到过,核心卡点就是如何用变量作为查询对象的键来访问嵌套的营业时间字段。别担心,ES6的计算属性名就能完美解决这个问题,结合Mongoose的嵌套字段查询语法就行,我给你一步步拆解:
1. 先明确你的Schema结构(补全示例)
假设你的restaurantSchema里的openingHours是嵌套对象,结构大概是这样:
const restaurantSchema = mongoose.Schema({ _id: mongoose.Schema.Types.ObjectId, name: String, // 嵌套的营业时间结构 openingHours: { Monday: { isOpen: Boolean, openTime: String, closeTime: String }, Tuesday: { isOpen: Boolean, openTime: String, closeTime: String }, Wednesday: { isOpen: Boolean, ... }, // 剩下的周四到周日同理 } }); const Restaurant = mongoose.model('Restaurant', restaurantSchema);
2. 动态构建查询条件
关键是用计算属性名(用方括号[]包裹变量表达式)来生成查询的键。比如你有一个变量targetDay表示要查询的星期几(比如"Tuesday"):
步骤1:获取动态的星期几变量(可选:自动获取当前日期对应的星期)
如果要自动获取今天的星期几,可以用Date对象转换:
// 映射数组:索引0对应周日,1对应周一,以此类推 const dayNameMap = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; const todayIndex = new Date().getDay(); const targetDay = dayNameMap[todayIndex]; // 比如今天是周二,targetDay就是"Tuesday"
步骤2:构建查询对象
用计算属性名拼接嵌套字段的路径:
// 查询目标星期几isOpen为true的餐厅 const query = { [`openingHours.${targetDay}.isOpen`]: true }; // 如果需要同时检查该字段存在且为true,可以用$exists和$eq // const query = { // [`openingHours.${targetDay}.isOpen`]: { $exists: true, $eq: true } // };
3. 执行Mongoose查询
把构建好的查询对象传给find()方法就行:
Restaurant.find(query) .exec() // 可选,返回标准Promise .then(openRestaurants => { console.log(`今天(${targetDay})营业的餐厅:`, openRestaurants); // 这里处理返回的结果 }) .catch(err => { console.error("查询失败:", err); // 错误处理 });
为什么直接写不行?
你可能试过直接写{ "openingHours.${targetDay}.isOpen": true },但这种写法里的模板字符串不会被解析,因为对象字面量的键在没有方括号包裹的情况下会被当作普通字符串,Mongoose会去匹配字面量为"openingHours.${targetDay}.isOpen"的字段,自然查不到数据。而计算属性名会先解析里面的变量表达式,生成正确的字段路径(比如openingHours.Tuesday.isOpen)。
内容的提问来源于stack exchange,提问作者Just A Guy
相关产品推荐
相关产品推荐

