Получить различные связанные данные из массивов ObjectIds в каждом документе? - PullRequest
0 голосов
/ 20 мая 2018

Итак, у меня есть коллекция Организации примерно так:

[
    {
        "name": "Organization 1",
        "locations": [
            "5b0096f064386ef34a5118d0", // Location 1
            "5b0096f064386ef34a5118d2" // Location 2
        ]
    },
    {
        "name": "Organization 2",
        "locations": [
            "5b0096f064386ef34a5118d0" // Location 1
        ]
    }
    // ~1,000 organizations ...
]

и коллекция Местоположения примерно так:

[
    {
        // Location 1
        "_id": "5b0096f064386ef34a5118d0",
        "state": "AK",
        "city": "Adak"
    },
    {
        // Location 2
        "_id": "5b0096f064386ef34a5118d2",
        "state": "AK",
        "city": "Akhiok"
    },
    // ~36,000 locations ...
    {
        // Location 3
        "_id": "5b0096f064386ef34a51a63e",
        "state": "WY",
        "city": "Yoder"
    }
]

Каждая Организация имеет массив идентификаторов местоположения (которые ссылаются на коллекцию Местоположение ).

Я хочу получить список различных "использованных" /Locations, на которые ссылаются, с заполненными данными (такими как город и штат).

Например, в приведенном выше сценарии я хотел бы получить обратно:

[
    {
        // Location 1
        "_id": "5b0096f064386ef34a5118d0",
        "state": "AK",
        "city": "Adak"
    },
    {
        // Location 2
        "_id": "5b0096f064386ef34a5118d2",
        "state": "AK",
        "city": "Akhiok"
    }
]

..., так как Location 1 иМестоположение 2 - единственные, на которые действительно ссылаются.

Есть идеи, как мне этого добиться?

1 Ответ

0 голосов
/ 20 мая 2018

Не пытайтесь сделать это одним запросом.При этом у вас будут асинхронные вызовы:

    MongoOrganization.findById(org_id, function (error, org) {
      if (error) res.send(error);

      let locations;

      MongoLocations.find({'_id': { $in: org.locations } }, function (err, locs) {
        if (err) res.send(err);
        locations = locs;
      })

      org.locations = locations;

      res.json(org);
    })

Вместо этого получите организации:

MongoOrganization.findById(org_id, function (error, org) {
   if (error) res.send(error);
   res.json(org);
})

Затем сделайте второй вызов, чтобы получить адреса:

MongoLocations.find({'_id': { $in: org.locations } }, function (err, locations) {
   if (err) res.send(err);
   res.json(locations);
})

а затем скопируйте массив строк с вашим массивом объектов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...