如何根据快递的日期从 mongoDB 获取数据?

How to get data from mongoDB based on date from express.?

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

Date format using to get data: yyyy-mm-dd (eg: 2015-04-14)

Format saved in collection : timestamp: "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);
        });
});

我知道,我在 'express' 代码函数中做错了。请帮助任何人解决这个问题。

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

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

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

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

首先,您需要构建表示 datetime 日开始和结束的 Date 对象。例如:

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); 
     });
});

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

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