首页 > 解决方案 > 如何使用属性读取MongoDB中的另一个集合?

问题描述

在我的 MEAN 堆栈应用程序中,我能够显示Event来自 mongoDb 的对象。

下面是该对象的示例:

{
    "_id" : ObjectId("5d415feedb87bc4470c560be"),
    "event_name" : "test event",
    "event_venue" : "5d40590dd4ea332774e940cb",
    "event_artist" : "5d406855171c152868ba71c8",
    "event_price" : "10",
    "__v" : 0
}

这是检索上述数据的 Typescript:

ngOnInit() {
    getEvent(): void {
        this.route.params.subscribe(params => {
            this.eventService.getEvent(params['id']).subscribe(res => {
                this.event = res;
            });
        });
    }
}

这是getEvent()我的 EventService 中的方法:

getEvent(id) {
    return this
        .http
          .get(`${this.uri}/get/${id}`);
}

以下是当前的 HTML:

<div>
    Event Name: {{event.event_name}}
    Venue: {{event.event_venue}}
    Artist:{{event.event_artist}}
    Price: {{event.event_price}}
</div>

上面的值event_venue&event_artistvenue&artist对象的 ID。

例如,这是我的venue对象:

{
    "_id" : ObjectId("5d40590dd4ea332774e940cb"),
    "venue_name" : "diceys",
    "venue_location" : "camden street",
    "__v" : 0
}

_idevent_venue in 。venue_event

而不仅仅是显示event.event_venue,有人可以告诉我如何使用它来检索venue.venue_name吗?

标签: angularmongodbmean-stack

解决方案


而不是在你的前端做一些事情,你应该在 mongodb 中使用聚合来改变你的查询并获得完整的细节。

例如:

db.event.aggregate([
    {
        $lookup: {
            from: 'venue',
            localField: 'event_venue',
            foreignField: '_id',
            as: 'venue'
        }
    },
    {
        $unwind: "$venue"
    },
    {
        $project: {
            _id: true,
            event_name: true,
            event_venue: "$venue.venue_name",
            event_artist: true,
            event_price: true

        }
    }
])

笔记:

  1. event_venue并且event_artist必须类型ObjectId不是字符串才能正确匹配。

  2. 我不看,artist因为您没有提供其详细信息,如果您想修改添加以下代码以获得与场地相同的正确艺术家详细信息。

{
    $lookup: {
        from: 'artist',
        localField: 'event_artist',
        foreignField: '_id',
        as: 'artist'
    }
},
{
    $unwind: "$artist"
},
{
    event_artist:"$artist.name",
}

回复

{
    "_id" : ObjectId("5d415feedb87bc4470c560be"),
    "event_name" : "test event",
    "event_artist" : ObjectId("5d406855171c152868ba71c8"),
    "event_price" : "10",
    "event_venue" : "diceys"
}

<div>
    Event Name: {{event.event_name}}
    Venue: {{event.event_venue}}
    Artist:{{event.event_artist}}
    Price: {{event.event_price}}
</div>

推荐阅读