Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从nodejs查询MongoDB中的日期范围_Node.js_Mongodb_Date Range - Fatal编程技术网

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”)}
})
以下是我在重组过程中改变的一些关键点:

  • 而不是字符串,每个ObjectId引用都是true;这将允许有效的比较和查找
  • 每个日期都使用ISODate格式进行标准化,而不是字符串;这将允许进行有效的比较,例如$gt
  • 考勤数据已扩展为一个dateitem对象数组,每个对象都有一个日期字段和一个引用对象字段(我猜这是参加会议人员的ID);这样,每个数据值都存储为一个-而不是字段名

  • 看起来您的日期保存在键(字段名)中;但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”)}
    })
    
    以下是我在重组过程中改变的一些关键点:

  • 而不是字符串,每个ObjectId引用都是true;这将允许有效的比较和查找
  • 每个日期都使用ISODate格式进行标准化,而不是字符串;这将允许进行有效的比较,例如$gt
  • 考勤数据已扩展为一个dateitem对象数组,每个对象都有一个日期字段和一个引用对象字段(我猜这是参加会议人员的ID);这样,每个数据值都存储为一个-而不是字段名

  • 在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这是一个大问题