从每个文档的ObjectIds数组中获取不同的相关数据?

时间:2018-05-20 00:12:04

标签: mongodb mongoose

所以我有一个组织的集合,如下所示:

[
    {
        "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"
    }
]

每个组织都有一系列位置ID(引用位置集合)。

我希望能够获得不同的"使用过的" /引用的位置列表,以及填充的数据(如城市和州)。

例如,在上面的场景中,我想回来:

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

...因为位置1和位置2是唯一实际引用的。

关于如何实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:0)

不要在单个查询中尝试这样做。你会遇到异步挑战:

int y = &x

取而代之的是组织:

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

然后使用对象数组

复制字符串数组