Запрос мангуста для выполнения соединения

1

У меня есть 2 сборника, как показано ниже, Dates и Streets.

То, что я хотел бы достичь, - это запросить Улицы с помощью параметра StreetName и посмотреть, чтобы найти его уникальный идентификатор, а затем запросить другую коллекцию с помощью этого идентификатора, чтобы отменить все даты, которые соответствуют.

Мой маршрут настроен на /wasteDate/:StreetName. Вот что у меня есть:

model.js

var DateSchema = new Schema({
  date: {
    type: Date
  },   
  street_id: {
    type: String,
  }
});

var StreetSchema = new Schema({
  name: {
    type: String
  }
});

routes.js

module.exports = function(app) {
    var wasteCollections = require('../controllers/wasteController'); 
    app.route('/wasteDate/:streetName')
        .get(wasteCollections.get_dates_by_street_name);
}; 

controller.js

var mongoose = require('mongoose'),
  ColDate = mongoose.model('Dates'),
  that = this,
  Street = mongoose.model('Streets');

(...)

exports.manual_get_dates_by_street = function (id) {
  var wasteDates = ColDate.find({ street_id: id }).lean();
  return wasteDates;
};

exports.get_dates_by_street_name = function (req, res) {
  Street.find({
    name: req.params.streetName
  }, function(err, street) {
    var query;
    var theStreetId = street[0].id;
    if (err) res.send(err);
    query = that.manual_get_dates_by_street(theStreetId);
    res.json(query);
  });
};

на данный момент я получаю круговую опорную ошибку на JSON.

Я не думаю, что я делаю это правильно и думаю, что мне может понадобиться изменить мою схему?

Любая помощь оценивается

Теги:
express
mongoose

2 ответа

0
Лучший ответ

Вы можете либо использовать (1) find дважды, либо (2) aggregation.

Здесь первый путь:

exports.manual_get_dates_by_street = function (id, callback) {
    // you are dealing with asynchronous operations, so you have to wait for the callback
    // to execute before you can get the data
    ColDate.find({ street_id: id }).lean().exec(callback);
};

exports.get_dates_by_street_name = function (req, res) {
    // you are expecting one result, so use findOne instead of find
    Street.findOne({ name: req.params.streetName }, function (err, street) {
        // make sure you handle errors properly such as stopping execution of
        // the next lines or else you may get unexpected errors
        if (err) 
            return res.send(err);

        // we pass a callback that will be executed once results (or an error) are found
        that.manual_get_dates_by_street(street._id, function (err, dates) {
            res.json({ dates: dates });
        });
    });
};
  • 0
    Благодарю. Работал лакомство
0

Я никогда не использовал его, но я думаю, что модели mongoose могут решить вашу проблему. https://github.com/SportZing/mongoose-models

Другим возможным подходом является включение второй функции запроса в качестве обратного вызова первого.

  • 1
    Благодарю. Вы были правы относительно обратного вызова, но я отметил другой ответ, поскольку он дал полный пример кода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню