Не могу получить точное значение с мангуста - PullRequest
0 голосов
/ 28 февраля 2020

Я хочу получить данные из mongodb, используя mon goose и отправить их как ответ, но я не получаю точного ответа, в чем моя ошибка?

Мои коды указаны ниже :

Во-первых, мой файл модели: * Я массово вставляю данные с помощью create ()

const express = require('express');
const mongoose= require('mongoose');

const Schema = mongoose.Schema;

const ourDataSchema = new Schema ({
   rank : Number,
   totalPoints : Number
});

const rankTotalpoint = mongoose.model("rankTotalpoint", ourDataSchema);

const ourData = [
     {rank : 1, totalPoints  : 2000},
     {rank : 2, totalPoints  : 1980},
     {rank:  3, totalPoints  : 1940},
     {rank:  4, totalPoints  : 1890},
     {rank : 5, totalPoints  : 1830},
     {rank : 6, totalPoints  : 1765},
     {rank : 7, totalPoints  : 1600},
     {rank : 8, totalPoints  : 1565},
     {rank : 9, totalPoints  : 1465},
     {rank : 10, totalPoints : 1450}
];


rankTotalpoint.create(ourData, function (error, data) {
    if (error) {
        console.log(error)
    }
    else {
        console.log('saved!');
    }
});


exports.result = function (param) {
     const finalresult = rankTotalpoint.aggregate([
        {
          $project: {
            diff: {
              $abs: {
                $subtract: [
                  param, // <<<----------------------- THIS IS THE USER SUPPLIED VALUE 
                  "$totalPoints"
                ]
              }
            },
            doc: "$$ROOT"
          }
        },
        {
          $sort: {
            diff: 1
          }
        },
        {
          $limit: 1
        },
        {
          $project: {
            _id: 0,
           rank: "$doc.rank"
          }
        }
      ])
   return finalresult;
};

И коды файлов моего контроллера, куда я импортировал свою функцию выше (результат) на это:

const express = require('express');

const model = require('../model/logic');

exports.index = (req, res, next) => {
    res.status(200).json({message : 'INSERT INPUTS HERE'});
    };


  exports.getUserData = (req, res, next) => {
     const literature = req.body.literature * 4;
     const arabic = req.body.arabic * 2;
     const religion = req.body.religion * 3;
     const english = req.body.english * 2;
     const math = req.body.math * 4;
     const physics = req.body.physics * 3;
     const chemistry = req.body.chemistry *2;

     //user supplied value
     const TOTALPOINT = literature + arabic + religion + english + math + physics + chemistry;

     let result = model.result(TOTALPOINT); 
     res.status(200).json(result); 
  };

И наконец, вот ответ, который я получаю с почтальоном:

{
    "_pipeline": [
        {
            "$project": {
                "diff": {
                    "$abs": {
                        "$subtract": [
                            0,
                            "$totalPoints"
                        ]
                    }
                },
                "doc": "$$ROOT"
            }
        },
        {
            "$sort": {
                "diff": 1
            }
        },
        {
            "$limit": 1
        },
        {
            "$project": {
                "_id": 0,
                "rank": "$doc.rank"
            }
        }
    ],
    "options": {}
}

Что я хочу получить? Я хочу получить rank на основе пользовательского ввода (TOTALPOINT), который я получаю, поэтому вместо отправки вышеуказанного ответа я просто хочу вернуть рейтинг пользователю. Если пользовательское значение соответствует totalpoints , отправьте его rank в качестве ответа и, если точного значения не существует, найдите ближайшие totalPoints и отправить ранг в качестве ответа.

Как это:

 [
  {
    "rank": 5
  }
]

Спасибо

1 Ответ

0 голосов
/ 28 февраля 2020

Ваша проблема в том, что Mon goose основан на обещании / асин c. Вы ничего не ожидаете, поэтому ваш код возвращает переменную, которая еще не была установлена ​​по вашему запросу ..

Я тестировал, используя 2 файла: myMongoose.js и index.js ..

// myMongoose.js

// ** CODE THAT SAVES DATA TO DATABASE HAS BEEN REMOVED FOR BREVITY **

require('dotenv').config();
const mongoose = require('mongoose');

const RankTotalpointSchema = new mongoose.Schema({
  rank: Number,
  totalPoints: Number
});

mongoose.set('useCreateIndex', true);

const mongoConnection = mongoose.createConnection(process.env.MONGO_DB_STRING, {
  useUnifiedTopology: true,
  useNewUrlParser: true,
  useFindAndModify: false,
});

const RankTotalpoint = mongoConnection.model("RankTotalpoint", RankTotalpointSchema, 'Testing');

/**
 * ~~~~~~ **** THIS HAS TO BE AN ASYNC FUNCTION **** ~~~~~~
 */
exports.result = async function (param) {
  const finalresult = await RankTotalpoint.aggregate([{
      $project: {
        diff: {
          $abs: {
            $subtract: [
              param, // <<<----------------------- THIS IS THE USER SUPPLIED VALUE 
              "$totalPoints"
            ]
          }
        },
        doc: "$$ROOT"
      }
    },
    {
      $sort: {
        diff: 1
      }
    },
    {
      $limit: 1
    },
    {
      $project: {
        _id: 0,
        rank: "$doc.rank"
      }
    }
  ])
  return finalresult;
};

... а затем в index.js:

// index.js

const { result } = require('./myMongoose');

// Use it like this:
async function init() {
    try {
        const d = await result(1800);
        console.log(d);
    } catch (err) {
        console.error(err);
    }
}

init(); // -> [ { rank: 5 } ]

// --------------------------------------------------------------------

// ...or like this:
(async () => {
    try {
        const d = await result(1800);
        console.log(d); // -> [ { rank: 5 } ]
    } catch (err) {
        console.error(err);
    }
})()

// --------------------------------------------------------------------

// ...or like this:
result(1800)
    .then(d => console.log(d)) // -> [ { rank: 5 } ]
    .catch(err => console.error(err))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...