【问题标题】:How to get data from mongoDB based on date from express.?如何根据 express 的日期从 mongoDB 获取数据?
【发布时间】:2015-04-14 11:54:02
【问题描述】:

我正在尝试根据创建日期从 mongoDB 集合中获取数据。

用于获取数据的日期格式: yyyy-mm-dd(例如:2015-04-14)

集合中保存的格式:时间戳:“2015-04-13T17:50:48.761Z”

控制器:

       $scope.getExpences = function (date) {
            SelectedMemberExpence.get( date )
                .success(function (result) {
                    $scope.allExpences = result;
                })
        }

服务:

.service('SelectedTimeExpence', function ($http) {
    return {
      get : function(datetime) {
      return $http.get('/api/expences/'+ datetime); 
    },
      delete : function(datetime) {
      return $http.delete('/api/expences/'+ datetime);
    }
   }
})

快递代码:

router
  .param('datetime', function (req, res, next) {
     req.dbQuery = { timestamp : req.params.datetime };
     next();
  })
  .route('/expences/:datetime')
     .get(function (req, res) {
        var collection = db.get('memberExpences');
        collection.find(req.dbQuery , function (err, data) {
            res.json(data);
        });
});

我知道,我在“表达”代码功能中做错了。请帮助任何人解决此问题。

【问题讨论】:

    标签: angularjs mongodb express timestamp isodate


    【解决方案1】:

    您集合中的timestamp 字段是字符串类型,类似于ISO 日期时间戳字符串。该查询肯定不起作用,因为您将比较两个完全不同的字符串(根据长度,timestamp 字段的字符数比datetime req 参数值多)。

    如果您要在文档架构中包含另一个实际代表日期的字段会容易得多:

    db.collection.find().forEach(function (doc){
        doc.created_on = ISODate(doc.timestamp);
        db.collection.save(doc);
    });
    

    然后,您可以使用范围查询来搜索其 created_on 字段的值大于表示 datetime 变量日开始的 Date 对象且小于表示 datetime 的 Date 对象的文档可变的一天结束。

    首先,您需要构造代表datetime 日的开始和结束的日期对象。例如:

    var datetime = "2015-04-14",
    start = new Date(datetime),
    dateParts = datetime.split('-'),
    y = parseInt(dateParts[0], 10),
    m = parseInt(dateParts[1], 10),
    d = parseInt(dateParts[2], 10),
    end = new Date(y, m-1, d+1);
    console.log(start.toISOString()); // "2015-04-14T00:00:00.000Z "
    console.log(end.toISOString());  // "2015-04-15T00:00:00.000Z"

    在您的 Express 代码中,您可以修改它以反映上述内容:

    router
      .param('datetime', function (req, res, next) {
          var start = new Date(req.params.datetime),
              dateParts = datetime.split('-'),
              y = parseInt(dateParts[0], 10),
              m = parseInt(dateParts[1], 10),
              d = parseInt(dateParts[2], 10),
              end = new Date(y, m-1, d+1);  
          req.dbQuery = {"created_on": { $gte: start, $lt: end }};
          next();
      })
      .route('/expences/:datetime')
         .get(function (req, res) {
            var collection = db.get('memberExpences');
            collection.find(req.dbQuery , function (err, data) {
                res.json(data);
            });
    });
    

    注意特殊 $ 运算符的使用,$gte(大于或等于)和 $lt(小于),用于执行范围查询以获取匹配的文档。

    使用 MomentJS

    var start = moment("2015-04-14").format();
    var end = moment(start).add('days', 1);
    db.collection.find({"created_on": {"$gte": start, "$lt": end}});
    

    编辑

    在节点中,Mongo 驱动程序会给你一个 ISO 字符串,而不是对象,因此如果你想在文档中包含一个额外的 created_on 字段,只需添加一个具有当前日期值的新字段。例如:

    .post(function (req, res) { 
         var date = new Date(); 
         var expence = req.body; 
         expence["created_on"] = date;
         var collection = db.get('memberExpences'); 
         collection.insert(expence, function (err, data) { 
             res.json(200); 
         });
    });
    

    【讨论】:

    • 感谢您提供如此详细的答案。我什么都懂,只是不明白如何创建“created_on”字段。由于我使用此函数生成------- .post(function (req, res) { var date = new Date(); var expence = req.body; expence.timestamp = date; var collection = db. get('memberExpences'); collection.insert(expence, function (err, data) { res.json(200); }) });--------- 如何在 'created_on' 字段中插入日期
    • @anonymousrajat 谢谢。我刚刚更新了我的答案以解决您的其他问题。我还意识到,您从节点中的时间戳字段获取的字符串是 ISO 字符串,而不是 ISODate 对象,但如果您在 Mongo shell 中查询,它会将类型显示为 ISODate。因此,您创建时间戳字段的方式是正确的方式,只是在 mongo 驱动程序中它表示为 ISO 字符串。
    • 成功了。谢谢@chridam。但我有一个问题,为什么在 end = new Date(y, m-1, d+1) 中有 -1 和 'm'。 d+1 很好,但是 y m-1
    • 这是因为使用JavaScript,在创建日期对象时,月份是从零开始的,而天不是。
    【解决方案2】:

    我想与您分享上述答案的一点改变

    var start = moment("2020-04-14").format();
    db.collection.find({"created_on": {"$gte": new Date(start)}});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      相关资源
      最近更新 更多