MongoDb, NodeJs, Express и Angular 2, объединение, извлечение и отображение данных из двух коллекций

1

У меня есть две коллекции манго:

  • местоположения: (locationId, locationCity, locationState, locationZip и т.д.}
  • carLocations: {carId, carType, carMake, locationId}

Я хотел бы получить данные

carAvailability: {locationCity, locationState, locationZip, carMake, carType}

На моем уровне nodejs Вот что я пытаюсь сделать:

Во-первых, я пытаюсь получить массив locationIds с помощью locationCity, locationState или locationZip. Когда у меня есть массив locationIds, я пытаюсь получить carLocations.

app.get("/api/carsbylocationids", function (req, res) {
  //console.log(" locationid:" + req.query.locationid);
  var locationIds  = JSON.parse(req.query.locationIds);
  console.log("locationIds: " + locationIds);
  console.log("carId: " + req.query.carId);
  db.collection(carsLocations).find(
    {
      'locationId': {$in:locationIds},
      'carId': req.query.carId
    }
  ).toArray(function (err, docs) {
    if (err) {
      handleError(res, err.message, "Failed to get items.");
    } else {
      res.header('Access-Control-Allow-Origin', '*');
      res.header('Access-Control-Allow-Methods', 'GET);
      res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
      res.status(200).json(docs);
    }
  });

});

Либо в этой части, либо в коде angularJS 2 (не указывается здесь), мне бы хотелось, чтобы carAvailability: {locationCity, locationState, locationZip, carMake, carType}, чтобы я мог перебирать и отображать на экране.

Я не могу прийти к лучшему/эффективному способу сделать это. Должен ли я обрабатывать этот тип соединения в слое nodeJS или Angular2?

  • 0
    Http-запросы являются одной из самых дорогостоящих операций во внешнем интерфейсе. Если вы можете, объедините их в своем бэкэнде, чтобы вы могли сделать только 1 http запрос от вашего бэкэнда. Но, конечно, это зависит и от других параметров (читаемость, сложность и т. Д.)
  • 0
    Я согласен с @echonax, вы можете использовать функцию заполнения в monogDB для такого рода объединений.
Показать ещё 3 комментария
Теги:
angular
express

1 ответ

1

Я использовал агрегирование по $ lookup и $ match для получения данных из mongoDb. Для тех из вас, кто хочет особенностей:

app.get("/api/locationsByitemid", function (req, res) {
  console.log(" itemid:" + req.query.itemid + " city:" + req.query.locationCity + " state:" + req.query.locationState);

  db.collection(LOCATIONS_COLLECTION).aggregate([
    { $lookup: { from: ITEMS_COLLECTION, localField: "locationId",foreignField: "locationId", as: "locationsbyLocationId"} },
    { $unwind:"$locationsbyLocationId"},
    { "$match": { 'locationsbyLocationId.itemid': req.query.itemid, 'locationCity': req.query.locationCity, 'locationState' : req.query.locationState} }
    ]
  ).toArray(function (err, docs) {
    if (err) {
      handleError(res, err.message, "Failed to get items.");
    } else {
      res.header('Access-Control-Allow-Origin', '*');
      res.header('Access-Control-Allow-Methods', 'GET');
      res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
      res.status(200).json(docs);
    }
  });

});

Это работает на мое удовлетворение, но любые предложения приветствуются.... Спасибо тем, кто указал, что это лучше всего обрабатывать до вызова службы RestFul. Вот что я изучил.

Ещё вопросы

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