我在使用model.find返回与嵌套模式中的变量条件匹配的文档列表时遇到了一些麻烦。我正在为这个项目使用node,express和mongoose。
理想情况下,我想在查询中使用变量作为对象键,这样我就可以动态获取星期几并检查开放时间。到目前为止,我还没有在网上找到答案。
这是我的模特。
const restaurantSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: { type: String, required: true },
coordinates: {
latitude: { type: Number, required: true },
longitude: { type: Number, required: true }
},
happy_hour: {
sunday: {
open: { type: Boolean },
open_at: { type: Number },
close_at: { type: Number }
},
monday: {
open: { type: Boolean },
open_at: { type: Number },
close_at: { type: Number }
},
tuesday: {
open: { type: Boolean },
open_at: { type: Number },
close_at: { type: Number }
},
wednesday: {
open: { type: Boolean },
open_at: { type: Number },
close_at: { type: Number }
},
thursday: {
open: { type: Boolean },
open_at: { type: Number },
close_at: { type: Number }
},
friday: {
open: { type: Boolean },
open_at: { type: Number },
close_at: { type: Number }
},
saturday: {
open: { type: Boolean },
open_at: { type: Number },
close_at: { type: Number }
}
}
});
以下是来自控制器的片段,它正在处理此快速路由的逻辑。下面的代码片段有一个名为" Friday"的静态键,但是我想动态获取星期几并将其作为变量传递,例如$ friday:{open:true}或者不是。
exports.search = (req, res, next) => {
const radius = req.query.radius || 5;
const latitude = req.query.latitude;
const longitude = req.query.longitude;
const day = date.get_day();
const minutes = date.get_minutes();
console.log(query[day]);
if ( latitude == undefined || longitude == undefined ) {
res.status(404).json({
message: "Missing longitude or latitude"
})
}
Restaurant.find({
hours: {
friday: {
open: true
}
}
})
.exec()
.then(results => {
res.status(200).json({
data: results.map( result => {
答案 0 :(得分:1)
您有多种选择。
mongoose期望的查询只是一个对象。
const query = { hours : {} };
hours[getTheCurrentDay()].open = true;
// Or with es6
const query = { hours : { [getTheCurrentDay()] : { open : true } };
// Or with pure string
const query = { `hours.${getTheCurrentDay()}.open` : true };
Restaurant.find( query ).exec()...
答案 1 :(得分:1)
你可以试试这个
var day = req.params.dayName;
var query = {};
query["hours"] = {[day] :true};
collection.find(query, function (err, item) { ... });