在嵌套文档中使用变量作为键来查询mongoose模型

时间:2018-04-18 07:51:54

标签: mongodb express mongoose

我在使用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 => {

2 个答案:

答案 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) { ... });