MongoDB Массив идентификаторов для сравнения и получения значения - PullRequest
1 голос
/ 11 марта 2020

Я немного новичок в использовании MongoDB и нет SQL для моего стека. И наконец, я переключаюсь на номер SQL, потому что JSON данные уже проанализированы. Я могу выполнить sh то, что хочу в MySQL - но я также пытаюсь научить себя чему-то новому.

В настоящее время у меня нет проблем с подключением и настройкой моих схем для NodeJS. У меня есть документ в MongoDB, который возвращает то, что мои клиенты платят за топливо в соответствии с национальными средними показателями - наши клиенты дают нам диапазоны, чтобы мы могли найти, какую именно сумму c долларов они платят.

Мой 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 - оно будет находиться в диапазоне от avgLow 1,19 до avgHigh 1,239, но возвращает фактическую оплату 0,01 в custFscPM

Мой MongoDB Mon goose Код узла выглядит следующим образом

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);
    });

1 Ответ

1 голос
/ 11 марта 2020

Вы можете использовать агрегацию , которая является более мощным способом запроса MongoDB, чем использование .find(), попробуйте запрос ниже:

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 являются строками, нам необходимо преобразовать их в удвоенные значения, чтобы сделать сравнение.

Тест: MongoDB-Playground

...