1

我正在尝试根据创建日期从 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);
        });
});

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

4

2 回答 2

0

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

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

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

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

首先,您需要构造表示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); 
     });
});
于 2015-04-14T13:30:03.083 回答
0

我必须与我想与您分享的上述答案一起使用的一点改变

var start = moment("2020-04-14").format();
db.collection.find({"created_on": {"$gte": new Date(start)}});
于 2020-04-20T08:47:08.413 回答