Node.js 从nodejs查询MongoDB中的日期范围
我正在尝试获取指定日期范围内的所有用户, 我的数据库结构如下所示:Node.js 从nodejs查询MongoDB中的日期范围,node.js,mongodb,date-range,Node.js,Mongodb,Date Range,我正在尝试获取指定日期范围内的所有用户, 我的数据库结构如下所示: { _id : ObjectId("58b545d4b57eeb2cc456248a"), "attendance" : [ { "2017-03-16" : ["58c108b9ebd9ae24dca81634"], "2017-03-17" : ["58c108b9ebd9ae24dca81634"], "2017-03
{
_id : ObjectId("58b545d4b57eeb2cc456248a"),
"attendance" : [
{
"2017-03-16" : ["58c108b9ebd9ae24dca81634"],
"2017-03-17" : ["58c108b9ebd9ae24dca81634"],
"2017-03-18" : ["58c108b9ebd9ae24dca81634"],
"2017-03-19" : ["58c108b9ebd9ae24dca81634"],
"2017-03-20" : ["58c108b9ebd9ae24dca81634","58c108b9ebd9ae24dca81635"]
},
{
"2017-03-17" : ["58c108b9ebd9ae24dca81634"],
"2017-03-18" : ["58c108b9ebd9ae24dca81634"],
"2017-03-19" : ["58c108b9ebd9ae24dca81634"],
"2017-03-20" : ["58c108b9ebd9ae24dca81634","58c108b9ebd9ae24dca81635"]
}
]
.......
}
要查询它,请执行以下操作:
routes.find({_id: ObjectId("58b545d4b57eeb2cc456248a"), $or:[{'attendance[0]' : {$gte: '2017-03-17' }}, {'attendance[1]': {$gte: '2017-03-17'}}]})
但它不会获取任何结果。看起来您的日期被保存在键(字段名)中;但MongoDB仅用于查询字段值中保存的数据。我建议您将数据重组为以下内容:
{
_id : ObjectId("58b545d4b57eeb2cc456248a"),
"attendance" : [
{
"2017-03-16" : ["58c108b9ebd9ae24dca81634"],
"2017-03-17" : ["58c108b9ebd9ae24dca81634"],
"2017-03-18" : ["58c108b9ebd9ae24dca81634"],
"2017-03-19" : ["58c108b9ebd9ae24dca81634"],
"2017-03-20" : ["58c108b9ebd9ae24dca81634","58c108b9ebd9ae24dca81635"]
},
{
"2017-03-17" : ["58c108b9ebd9ae24dca81634"],
"2017-03-18" : ["58c108b9ebd9ae24dca81634"],
"2017-03-19" : ["58c108b9ebd9ae24dca81634"],
"2017-03-20" : ["58c108b9ebd9ae24dca81634","58c108b9ebd9ae24dca81635"]
}
]
.......
}
{
_id:ObjectId(“58b545d4b57eeb2cc456248a”),
“出席人数”:[
{
“日期项目”:[
{“何时”:ISODate(“2017-03-16”),“世卫组织”:[ObjectId(“58c108b9ebd9ae24dca81634”),
{“何时”:ISODate(“2017-03-17”),“世卫组织”::[ObjectId(“58c108b9ebd9ae24dca81634”)],
{“何时”:ISODate(“2017-03-18”),“世卫组织”::[ObjectId(“58c108b9ebd9ae24dca81634”)],
{“时间”:ISODate(“2017-03-19”),“世卫组织”::[ObjectId(“58c108b9ebd9ae24dca81634”)],
{“何时”:ISODate(“2017-03-20”),“who”::[ObjectId(“58c108b9ebd9ae24dca81634”),ObjectId(“58c108b9ebd9ae24dca81635”)]
]
},
{
“日期项目”:[
{“何时”:ISODate(“2017-03-17”),“世卫组织”:[ObjectId(“58c108b9ebd9ae24dca81634”),
{“何时”:ISODate(“2017-03-18”),“世卫组织”:[ObjectId(“58c108b9ebd9ae24dca81634”),
{“何时”:ISODate(“2017-03-19”),“世卫组织”:[ObjectId(“58c108b9ebd9ae24dca81634”),
{“何时”:ISODate(“2017-03-20”),“who”:[ObjectId(“58c108b9ebd9ae24dca81634”,ObjectId(“58c108b9ebd9ae24dca81635”)]
}
}
]
.......
}
使用这种数据结构,您可以通过查询获得所需的输出,例如:
{
_id : ObjectId("58b545d4b57eeb2cc456248a"),
"attendance" : [
{
"2017-03-16" : ["58c108b9ebd9ae24dca81634"],
"2017-03-17" : ["58c108b9ebd9ae24dca81634"],
"2017-03-18" : ["58c108b9ebd9ae24dca81634"],
"2017-03-19" : ["58c108b9ebd9ae24dca81634"],
"2017-03-20" : ["58c108b9ebd9ae24dca81634","58c108b9ebd9ae24dca81635"]
},
{
"2017-03-17" : ["58c108b9ebd9ae24dca81634"],
"2017-03-18" : ["58c108b9ebd9ae24dca81634"],
"2017-03-19" : ["58c108b9ebd9ae24dca81634"],
"2017-03-20" : ["58c108b9ebd9ae24dca81634","58c108b9ebd9ae24dca81635"]
}
]
.......
}
routes.aggregate([
{$match:{{u id:ObjectId(“58b545d4b57eeb2cc456248a”)},
{$match:{“出席.日期项目.时间”:{$gt:ISODate(“2017-03-17”)}
})
以下是我在重组过程中改变的一些关键点:
看起来您的日期保存在键(字段名)中;但MongoDB仅用于查询字段值中保存的数据。我建议您将数据重新构造为如下内容:
{
_id : ObjectId("58b545d4b57eeb2cc456248a"),
"attendance" : [
{
"2017-03-16" : ["58c108b9ebd9ae24dca81634"],
"2017-03-17" : ["58c108b9ebd9ae24dca81634"],
"2017-03-18" : ["58c108b9ebd9ae24dca81634"],
"2017-03-19" : ["58c108b9ebd9ae24dca81634"],
"2017-03-20" : ["58c108b9ebd9ae24dca81634","58c108b9ebd9ae24dca81635"]
},
{
"2017-03-17" : ["58c108b9ebd9ae24dca81634"],
"2017-03-18" : ["58c108b9ebd9ae24dca81634"],
"2017-03-19" : ["58c108b9ebd9ae24dca81634"],
"2017-03-20" : ["58c108b9ebd9ae24dca81634","58c108b9ebd9ae24dca81635"]
}
]
.......
}
{
_id:ObjectId(“58b545d4b57eeb2cc456248a”),
“出席人数”:[
{
“日期项目”:[
{“何时”:ISODate(“2017-03-16”),“世卫组织”:[ObjectId(“58c108b9ebd9ae24dca81634”),
{“何时”:ISODate(“2017-03-17”),“世卫组织”::[ObjectId(“58c108b9ebd9ae24dca81634”)],
{“何时”:ISODate(“2017-03-18”),“世卫组织”::[ObjectId(“58c108b9ebd9ae24dca81634”)],
{“时间”:ISODate(“2017-03-19”),“世卫组织”::[ObjectId(“58c108b9ebd9ae24dca81634”)],
{“何时”:ISODate(“2017-03-20”),“who”::[ObjectId(“58c108b9ebd9ae24dca81634”),ObjectId(“58c108b9ebd9ae24dca81635”)]
]
},
{
“日期项目”:[
{“何时”:ISODate(“2017-03-17”),“世卫组织”:[ObjectId(“58c108b9ebd9ae24dca81634”),
{“何时”:ISODate(“2017-03-18”),“世卫组织”:[ObjectId(“58c108b9ebd9ae24dca81634”),
{“何时”:ISODate(“2017-03-19”),“世卫组织”:[ObjectId(“58c108b9ebd9ae24dca81634”),
{“何时”:ISODate(“2017-03-20”),“who”:[ObjectId(“58c108b9ebd9ae24dca81634”,ObjectId(“58c108b9ebd9ae24dca81635”)]
}
}
]
.......
}
使用这种数据结构,您可以通过查询获得所需的输出,例如:
{
_id : ObjectId("58b545d4b57eeb2cc456248a"),
"attendance" : [
{
"2017-03-16" : ["58c108b9ebd9ae24dca81634"],
"2017-03-17" : ["58c108b9ebd9ae24dca81634"],
"2017-03-18" : ["58c108b9ebd9ae24dca81634"],
"2017-03-19" : ["58c108b9ebd9ae24dca81634"],
"2017-03-20" : ["58c108b9ebd9ae24dca81634","58c108b9ebd9ae24dca81635"]
},
{
"2017-03-17" : ["58c108b9ebd9ae24dca81634"],
"2017-03-18" : ["58c108b9ebd9ae24dca81634"],
"2017-03-19" : ["58c108b9ebd9ae24dca81634"],
"2017-03-20" : ["58c108b9ebd9ae24dca81634","58c108b9ebd9ae24dca81635"]
}
]
.......
}
routes.aggregate([
{$match:{{u id:ObjectId(“58b545d4b57eeb2cc456248a”)},
{$match:{“出席.日期项目.时间”:{$gt:ISODate(“2017-03-17”)}
})
以下是我在重组过程中改变的一些关键点:
在node.js中,我们可以通过new Date()查询ISODate以查找日期范围数据
db.collectionName.find({
'updatedAt': {
$gte: new Date('2019-04-19T14:16:04.065Z'),
$lte: new Date('2019-04-19T14:16:04.070Z')
}})
在node.js中,我们可以通过new Date()查询ISODate以查找日期范围数据
db.collectionName.find({
'updatedAt': {
$gte: new Date('2019-04-19T14:16:04.065Z'),
$lte: new Date('2019-04-19T14:16:04.070Z')
}})
谢谢你的宝贵意见,你能帮我弄清楚我该如何编辑当前的数据库并以新的格式保存它吗,因为我是新手this@warl0ck这是一个大问题,如果不知道数据库是如何创建和维护的,就不可能可靠地回答可行的方法可能是定义一个数据迁移过程,将现有数据转换为新格式。但是,您还需要更改应用程序的数据库命令,以便以新格式存储新数据。是的,我知道我必须在nodejs模板中更改其保存方式和模型的数据格式,但是如何更改以便我可以搜索日期范围。PS:我拥有所有访问权限。从nodejs我获得参考错误:未定义ISODate感谢有价值的输入,您能帮助我如何编辑当前数据库并将其保存为新格式吗,因为我对this@warl0ck这是一个大问题