如何在mongodb中检查两个日期之间的给定日期?

时间:2016-04-19 08:15:39

标签: node.js mongodb date express

{
  "_id": {
    "$oid": "asdf976"
  },
  "Categories": [{
    "mainmodels": [{
      "submodels": [{
          "price": "2000",
          "submodelname": "lumia021",

        }, {
          "price": "2000",
          "submodelname": "lumia341",

        }

      ],
      "Status": "Active",
      "modelname": "lumia",
      "fromdate": "15/04/2016",
      "todate": "29/04/2016"
    }],
    "brand": "nokia"
  }],
  "rank": "1",
  "name": "first Mobile station"
}

{
  "_id": {
    "$oid": "asdf976"
  },
  "Categories": [{
    "mainmodels": [{
      "submodels": [{
          "price": "2000",
          "submodelname": "lumia a02",

        }, {
          "price": "2000",
          "submodelname": "lumia trend",

        }

      ],
      "Status": "Active",
      "modelname": "lumia",
      "fromdate": "20/04/2016",
      "todate": "21/04/2016"
    }],
    "brand": "nokia"
  }],
  "rank": "2",
  "name": "Zahid station"
}
{
  "_id": {
    "$oid": "asdf976"
  },
  "Categories": [{
    "mainmodels": [{
      "submodels": [{
          "price": "2000",
          "submodelname": "trend 45",

        }, {
          "price": "2000",
          "submodelname": "trendz",

        }

      ],
      "Status": "Active",
      "modelname": "trend",
      "fromdate": "10/04/2016",
      "todate": "21/04/2016"
    }],
    "brand": "samsung"
  }],
  "rank": "3",
  "name": "mobi cell station"

}

上面我添加了存储在mongodb数据库中的数据。我怎样才能在任何地方找到数据  “状态”:“活跃”,  “modelname”:“lumia”,  “日期”: “19/04/2016”

以上是我的条件,日期只有我无法解决的事情   这里给定的日期是在fromdate和todate之间,然后只有它应该给出结果

我需要查看给定日期(2016年4月19日),这是在fromdate和todate之间,之后我需要检查“Status”:“Active”,  “modelname”:“lumia”,

我的控制员:

exports.search = function(req, res) {
 var condition = {
'modelname': 'lumia',
'Status':'Active'


};
        Phone.find(condition).sort('-created').populate('user', 'displayName').exec(function(err, phones) {
                if (err) {
                        return res.status(400).send({
                                message: errorHandler.getErrorMessage(err)
                        });
                } else {
                        res.jsonp(phones);

                }
        });
};

模式:

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var submodelSchema = {
   submodelname: {type:String, required: false},
   price: {type:String, required: false},
   Remainingphones: {type:String, required: false},
   Bookedphones: {type:String, required: false},
   Numofphones: {type:String, required: false}
 };

submodelSchema  = 'new Schema('+ submodeleSchema +',{_id:true})';

var typeSchema = {
   vtype: {type:String, required: false},
   mainservices: {
   Status: {type:String, required: false},
   modelname : {type:String, required: false},
   fromdate: {type: Date,default: Date.now},
   todate: {type: Date,default: Date.now}
   },
   submodels: [submodelSchema], default:[]
};
typeSchema  = 'new Schema('+typeSchema +',{_id:true})';

var PhoneSchema = new Schema({
        rank: {
                type: String,
                default: '',
                trim: true
        },
        name: {
                type: String,
                default: '',
                trim: true
        },
   Categories: [typeSchema], default:[]


});
 mongoose.model('Phone', PhoneSchema);

4 个答案:

答案 0 :(得分:4)

如果您想在fromdatetodate之间找到查询日期,还要检查modelnameStatus,那么可以遵循此条件。

根据您给定的模型结构,您需要使用.)表示法检查您的日期,如:Categories.mainmodels.fromdate并需要使用$lte小于或等于)和$gte大于或等于)运算符。

var queryDate = '19/04/2016';  // or like: var queryDate = req.query.date; or as you sent

 var condition = {
       'modelname': 'lumia',
       'Status':'Active',
       'Categories.mainmodels.fromdate': {$gte: queryDate },
       'Categories.mainmodels.todate': {$lte: queryDate }
};

Phone.find(condition).sort('-created').// rest of code

答案 1 :(得分:3)

我没有正确理解您的问题,但您应将日期存储为日期。 你可以像这样设计你的模式

    fromDate: Date,
    untilDate: Date

并查找日期是否存储在fromDate和untilDate之间的日期之间,您可以使用 $ gte $ lt

 $gte: fromDate,
 $lte : untilDate

答案 2 :(得分:1)

只需将条件变量修改为

即可
var yourDate='19-04-2016';    
var condition = {
     'modelname':'lumia',
     'Status':'Active',
     'fromDate':{ $gte: yourDate},
     'untilDate':{$lte : yourDate}

};

您可以浏览有关$ gte和$ lte

的文档

https://docs.mongodb.org/manual/reference/operator/query/gte/

此外,如果日期格式不正确或日期类型不正确  是字符串,你必须使用Moment.js显式解析它。

以下是Link看看它:  http://momentjs.com/docs/

答案 3 :(得分:1)

最好的方法是将日期值保存为Date而不是String。在插入数据时,请执行以下操作:> ' categories.mainmodels.fromdate':新日期('日期字符串')和其他日期相同。这将在db中创建一个Date类型,这将更容易比较,如下所示。请遵循mm / dd / yyyy格式创建新日期;

var givenDate = new Date(' 04/19/2016'); (毫米/日/年)

var condition = {        ' modelname':' lumia',        '状态':'主动&#39 ;,        ' Categories.mainmodels.fromdate':{$ gte:givenDate},        ' Categories.mainmodels.todate':{$ lte:givenDate} };

Phone.find(条件)的.sort(' -created&#39)。

请注意,而不仅仅是" date-string",在插入/更新时会执行新的日期("日期字符串"),这将创建日期,并允许您进行比较上方。

如果值是db中的日期本身,请记住从要与之比较的字符串中创建日期。在您的情况下,您有{$ gte:' date-string'}替换为{$ gte:new Date(' date-string')}等等。 [仅当数据已经存储为日期并且它返回日期值而不是日期字符串时才会遵循。