Mongodb mongo find与聚合结果之间的冲突
我有一个正在尝试执行的聚合查询Mongodb mongo find与聚合结果之间的冲突,mongodb,date,mongoose,Mongodb,Date,Mongoose,我有一个正在尝试执行的聚合查询 [ { "$match": { "restaurantId": 138, "createdAt": { "$lte": "2016-08-27 23:59:59", "$gte": "2016-08-19" } } }, { "$group": {
[
{
"$match": {
"restaurantId": 138,
"createdAt": {
"$lte": "2016-08-27 23:59:59",
"$gte": "2016-08-19"
}
}
},
{
"$group": {
"_id": "null",
"count": { "$sum": 1 }
}
}
]
和普通查找查询
{
"restaurantId": 138,
"createdAt": {
"$lte": "2016-08-27 23:59:59",
"$gte": "2016-08-19"
}
}
这个find查询得到了所需的结果。但是聚合查询给了我[]
数据库中的日期以以下格式存储:ISODate(“2016-08-26T08:19:21.883+0000”)
这就是我生成日期字符串的方式
filter.query.createdAt = {
"$lte": moment(Number(data.createdAt.to)).format("YYYY-MM-DD 23:59:59"),
"$gte": moment(Number(data.createdAt.from)).format("YYYY-MM-DD")
};
哪里出错了?您当前的查询正在将存储的日期与字符串进行比较,您需要从字符串创建日期对象表示形式,以便查询正常工作。使用本机JS构造函数创建日期实例:
var end = new Date("2016-08-27 23:59:59"),
start = new Date("2016-08-19");
var pipeline = [
{
"$match": {
"restaurantId": 138,
"createdAt": { "$lte": end, "$gte": start }
}
},
{
"$group": {
"_id": null,
"count": { "$sum": 1 }
}
}
]
有关在MongoDB中处理日期的更多详细信息,请参阅,但简而言之:
mongo shell提供了各种方法来返回日期,如
作为日期对象的字符串或字符串:
方法,该方法以字符串形式返回当前日期李>Date()
构造函数,它使用ISODate()包装返回日期对象新日期()
使用ISODate()返回日期对象的构造函数 包装纸李>ISODate()
如果使用momentjs库,请使用扩展方法返回日期对象:
var end = moment(Number(data.createdAt.to)).toDate(),
start = moment(Number(data.createdAt.from)).toDate();
要将23:59:59追加到日期,您可以在时刻的日期对象上使用and方法,将字符串'day'
作为参数传递:
var start = moment(Number(data.createdAt.from)).startOf('day').toDate(); // set to 12:00 am for that date
var end = moment(Number(data.createdAt.to)).endOf('day').toDate(); // set to 23:59 pm for that date
添加了关于我如何生成日期字符串的问题。您需要在矩对象上调用
.toDate()
,以返回对序列化有效的JavaScript日期对象,但我需要在请求中获得的日期后追加23:59:59。我已使用适当的方法更新了我的答案,以便在您希望追加时间时使用。“$gte”:“2016-08-19”应带有时间“$gte”:“2016-08-19 00:00:00”