【问题标题】:Query MongoDB with input form使用输入表单查询 MongoDB
【发布时间】:2017-01-04 11:27:09
【问题描述】:

我有一个 MongoDB 聚合框架,它使用 startDateendDateintervalValue 来查询我的数据库。然而,这些变量是硬编码的。我想使用日期选择器从网页发送startDateendDateintervalValue

我最初认为我应该拆分 JS 文件。一个处理来自网页的请求,另一个处理GET 函数。不幸的是,我已经走到了死胡同。我无法在test.js 中使用在sandbox.js 中声明的变量。

此外,我对如何构建我的 JS 文件以输入日期和显示输出有点困惑。

sandbox.js

function myTime() {


    var startValue = document.getElementById("startTime").value;
    var endValue = document.getElementById("endTime").value;
    var intervalValue = document.getElementById("interval").value;
    var startDate = new Date("1/1/2015 " + startValue);
    var endDate = new Date("1/1/2015 " + endValue);
    var offset = intervalValue * 1000 * 60;
}

test.js

{ $match : { datetime : { $gt : startDate, $lt : endDate } } },
  {
   $group: {
    _id:{
    "$add": [
     { "$subtract": [
     { "$subtract": [ "$datetime", new Date(0) ] },
     { "$mod": [
    { "$subtract": ["$datetime" , new Date(0) ] },
    offset]}] },
    new Date(0)
     ]},
            Humidity: {$avg: "$humidity"},
            Temperature: {$avg: "$temperature"}

            },
            },

      { $project : { _id : 1 , Humidity : 1, Temperature: 1 } },
       // { $limit : 10 },
       { $sort :  {"_id":1, "Humidity":1, "Temperature": 1}}

如果我能得到一些帮助,我会很高兴。谢谢

【问题讨论】:

    标签: javascript mongodb datepicker forms http-post


    【解决方案1】:

    首先,您需要确保这两个文件都包含在您正在加载的 HTML 页面(即您的表单)中。

    接下来,我看到你的 test.js 文件只是一个 JSON 对象。

    我建议更改此设置,以便您通过函数调用返回 JSON 对象。这将允许您将收集的输入传递到函数中,以返回所需的 JSON 对象以发送到 Mongo。

    我建议尝试以下更改:

    sandbox.js 更改

    function myTime() {
         var result = {}
         result.startValue = document.getElementById("startTime").value;
         result.endValue = document.getElementById("endTime").value;
         result.intervalValue = document.getElementById("interval").value;
         result.startDate = new Date("1/1/2015 " + startValue);
         result.endDate = new Date("1/1/2015 " + endValue);
         result.offset = intervalValue * 1000 * 60;
         return result;
       }
    

    这将允许您将所有变量放入结果中以传递给 test.js 文件

    test.js 更改

    function getMongoObject(values) {
       return { "$match" : { "datetime" : { "$gt" : values.startDate, "$lt" : values.endDate } } },
            {
             "$group": {
            "_id":{
            "$add": [
             { "$subtract": [
             { "$subtract": [ "$datetime", new Date(0) ] },
             { "$mod": [
            { "$subtract": ["$datetime" , new Date(0) ] },
            values.offset]}] },
            new Date(0)
             ]},
            "Humidity": {$avg: "$humidity"},
            "Temperature": {$avg: "$temperature"}
    
            },
            },
    
           { "$project" : { "_id" : 1 , "Humidity" : 1, "Temperature": 1 } },
           // { "$limit" : 10 },
           { "$sort" :  {"_id":1, "Humidity":1, "Temperature": 1}}
    }
    

    test.js 文件进行这些更改后,您可以在要获取 JSON 对象以传递给 Mongo 的位置执行以下操作。

    var mongoValues = getTime();
    var mongoObject = getMongoObject(mongoValues);
    

    现在您可以使用 mongoObject 发送到数据库。

    更新: 方法二:

    如果您不想将变量发送到 test.js 文件,您需要将 sandbox.js 文件中的变量设为全局变量。目前它们是“私有的”(仅限于函数)

    尝试对 sandbox.js

    进行这些更改
    var startValue, endValue, intervalValue, startDate, endDate, offset;
    function myTime() {
         startValue = document.getElementById("startTime").value;
         endValue = document.getElementById("endTime").value;
         intervalValue = document.getElementById("interval").value;
         startDate = new Date("1/1/2015 " + startValue);
         endDate = new Date("1/1/2015 " + endValue);
         offset = intervalValue * 1000 * 60;
       }
    

    在我看来,选项 1 仍然更好,因为它允许您控制要绑定到您将传递给 Mongo 的 JSON 对象的变量。

    使用此方法,由于在调用 test.js 时未设置变量或由于变量被意外覆盖,您可能会意外地在 JSON 对象中得到不同的结果。

    更新 3

    为了访问 test.js 文件中的 startDate 和其他变量,您需要将 JSON 对象设为变量。

    我已经制作了一个 github repo 进行测试,以表明你想要我的意思是,在这里查看: https://github.com/NewteqDeveloper/so-q-41462690 在此示例中,您会注意到警报显示 2. (startdate + 1)。

    有关更多信息,请查看此 stackoverflow 页面:Can I access variables from another file?

    需要注意的是,您需要在 html 页面中的 test.js 文件之前包含 sandbox.js 文件。

    【讨论】:

    • 感谢您的及时回复。我的test.js 将 JSON 响应发送到另一个 JS 文件,该文件绘制数组中值的图表。所以基本上我正在寻找一种从网页获取变量的方法,当我提交它时会重新加载我的图表。
    • 如果您不想将函数sandbox.js 的结果传递到test.js 文件中,则需要将您在getTime() 函数中设置的变量设为全局变量。这样,我将更新答案以反映此选项
    • 第二个选项是我正在寻找的。但是我仍然收到startDate is not defined 是否需要包含或要求来自sandbox.js 的任何内容谢谢
    • 您可能需要使您的 JSON 对象成为一个函数或一个保存 JSON 对象的变量,而不仅仅是 JSON 对象。请在答案中查看我的更新。您会注意到,在 github 存储库中有一个 test2.js,它将向您展示如何将其作为变量来执行,您可以稍后使用(注意该值已记录到控制台)
    • 感谢您回复我。让我明确解释一下我的程序是如何工作的。我通过 Websocket 将温度和湿度从 Arduino 发送到我的 MongoDB。我正在寻找创建一个 Web 应用程序来显示当前数据读取并在图表和表格中显示历史事件。我选择了 MongoDB 聚合框架来过滤我的数据库。但是,我想绑定一个日期选择器,它将 startDateendDate 发送到我的 MongoDB 框架,并在我从表单提交后将这些值显示在我的图表上。
    猜你喜欢
    • 1970-01-01
    • 2017-12-22
    • 2011-10-24
    • 2012-02-28
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多