如何根据均值堆栈应用中的外键过滤MongoDB集合



在我的平均堆栈应用中,我有一个Venue-Detail组件,我正在尝试显示与此场所相关的所有即将发生的事件。

以下是我的MongoDB中venue集合的示例:

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

我也有一个event集合:

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

如您所见,venue._idevent.event_venue相同。

我有以下所有事件的代码:

getEvents(): void {
    this.eventService
      .getEvents()
        .subscribe((data: Event[]) => {
            this.events = data;
    });
}

我已经将venue_id存储在下面的变量中,因此我只需要根据该

过滤事件
this.route.paramMap.subscribe(params => {
    this.venue_id = params.get('id');
});

活动服务:

getEvents() {
    return this
      .http
        .get(`${this.uri}`);
}

但是有人可以告诉我如何根据场地过滤上面的events对象?IE。仅显示链接到此场所的事件。

从聚合中使用MongoDB的$lookup阶段:

   db.venue.aggregate([{ $match: { _id: ObjectId("5d40590dd4ea332774e940cb") } }, {
    $project: {
        "_id": {
            "$toString": "$_id"
        },
        venue_name: 1,
        venue_location: 1
    }
}, {
    $lookup:
    {
        from: 'event',
        localField: '_id',
        foreignField: 'event_venue',
        as: 'eventsList'
    }
}])

或者您在场地中的字段太多,并且在上面的$project中列出所有内容并不好,请使用以下查询,也将_id列为_id to String event_venue中的string_venue作为字符串:

db.venue.aggregate([{$match:{_id:ObjectId("5d40590dd4ea332774e940cb")}},{
    $addFields: {
      "_idString": {
        "$toString": "$_id"
      }
    }
  },{
   $lookup:
     {
       from: 'event',
       localField: '_idString',
       foreignField: 'event_venue',
       as: 'eventsList'
     }
},{$project :{
   _idString:0 }}])

或者如果您不介意_id返回为字符串:

db.venue.aggregate([{$match:{_id:ObjectId("5d40590dd4ea332774e940cb")}},{
    $addFields: {
      "_id": {
        "$toString": "$_id"
      },
      venue_name : '$venue_name'
    }
  },{
   $lookup:
     {
       from: 'event',
       localField: '_id',
       foreignField: 'event_venue',
       as: 'eventsList'
     }
}])

当您将其内部使用时,您不需要使用_id的ObjectId()

我设法将其与以下代码合作:

html:

<div *ngFor="let event of myEvents">
    Event Name: {{event.event_name}}
</div>

打字稿:

getVenueId(): void {
    this.route.paramMap.subscribe(params => {
        this.venue_id = params.get('id');
    });
    this.getAllEvents();
}
getAllEvents(): void {
    this.eventService.getEvents().subscribe(events => {
        this.allEvents = events;         
        this.filterMyEvents(this.allEvents);
    });
}
filterMyEvents(allEvents): void {
    this.myEvents = allEvents.filter(event => event.event_venue === this.venue_id);    
}

首先,我检索包含所有事件的列表,然后使用venue_id过滤该列表以显示与该场所相关的事件

相关内容

  • 没有找到相关文章

最新更新