Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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 ID为'的MongoDB数组;s比较并提取一个值_Node.js_Mongodb_Mongoose_Mongodb Query_Aggregation Framework - Fatal编程技术网

Node.js ID为'的MongoDB数组;s比较并提取一个值

Node.js ID为'的MongoDB数组;s比较并提取一个值,node.js,mongodb,mongoose,mongodb-query,aggregation-framework,Node.js,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我在堆栈中使用MongoDB和NoSQL有点新。最后,我将切换到NoSQL,因为已经有JSON解析数据了。我可以在MySQL中实现我想要的——但我也在尝试教自己一些新的东西 目前,我在连接和设置NodeJS模式方面没有问题。我在MongoDB中有一个文件,它根据全国平均水平返回我的客户支付的燃油价格-我们的客户给我们提供范围,以便我们能够找到他们支付的具体金额 我的MongoDB文档如下所示: main_database |- customerFSC (name of document) |--

我在堆栈中使用MongoDB和NoSQL有点新。最后,我将切换到NoSQL,因为已经有JSON解析数据了。我可以在MySQL中实现我想要的——但我也在尝试教自己一些新的东西

目前,我在连接和设置NodeJS模式方面没有问题。我在MongoDB中有一个文件,它根据全国平均水平返回我的客户支付的燃油价格-我们的客户给我们提供范围,以便我们能够找到他们支付的具体金额

我的MongoDB文档如下所示:

main_database
|- customerFSC (name of document)
|-- 
{
"_id":{"$oid":"5e5ecc04e8da861114079ab2"},
"custID":"01",
"custName":"Customer ABC",
"avgLow":["1.19","1.24","1.29","1.34","1.39","1.44","1.49","1.54","1.59","1.64","1.69","1.74","1.79","1.84","1.89","1.94","1.99"],
"avgHigh":["1.239","1.289","1.339","1.389","1.439","1.489","1.539","1.589","1.639","1.689","1.739","1.789","1.839","1.889","1.939","1.989","2.039"],
"custFscPM":["0.01","0.02","0.03","0.04","0.05","0.06","0.07","0.08","0.09","0.10","0.11","0.12","0.13","0.14","0.15","0.16","0.17"]
}
如果一周的平均燃油量为1.215,则介于1.19的平均燃油量和1.239的平均燃油量之间,但返回的实际工资为0.01,单位为custFscPM

我的MongoDB Mongoose节点代码如下

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const fscCustSchema = new Schema({
    custID: String,
    custName: String,
    avgLow: Array,
    avgHigh: Array,
    custFscPM: Array
  },
  { collection: 'customerFSC' }
);

module.exports = mongoose.model('customerFSC', fscCustSchema);




    fscCustModel.find( { $and: [ 
      { $gte: [ { avgLow: USAFscAVG } ] },
      { $lte: [ { avgHigh: USAFscAVG } ] }
    ]},function(err2,resp2) {
      if (err2) console.log("Error Thrown Looking up Fuel:" + err2);
      console.log(resp);
    });
您可以使用比使用
.find()
更强大的方式来查询MongoDB,请尝试以下查询:

db.collection.aggregate([
    {
      $project: {
        custFscPM: {
          $arrayElemAt: [
            "$custFscPM",
            {
              $indexOfArray: [
                "$avgLow",
                {
                  $arrayElemAt: [
                    {
                      $filter: {
                        input: "$avgLow",
                        cond: {
                          $gte: [
                            {
                              $toDouble: "$$this"
                            },
                            1.94 // Your input
                          ]
                        }
                      }
                    },
                    0
                  ]
                }
              ]
            }
          ]
        }
      }
    }
  ])
查看您的数据,在此查询中,我们将在avgLow数组中查找大于或等于传入值的元素,并获取其索引,然后从custFscPM在相同索引处查找元素,这将解决您的需求

注意:由于avgLow中的值是字符串,我们需要将它们转换为双精度值,以便进行比较


测试:

你我的朋友是圣人,因为这确实是从文档中提取出来的。非常感谢。当我传递我的输入/值(1.94)时,是否需要将其作为字符串或数字传递?@elisciandrello:将其作为数字(double)传递,这样可以保证比较是正确的!!因为比较字符串类型的两个数值是不可行的..通过将拉取的字符串传递给一个var并通过Number()处理它来解决这个问题--谢谢您的帮助!