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