如何根据 MEAN 堆栈应用程序中的外键过滤 mongoDb collection?

How to filter a mongoDb collection based on a foreign key in MEAN stack app?

在我的 MEAN 堆栈应用程序中,我有一个 Venue-Detail 组件,我试图显示与该场所相关的所有即将发生的事件。

下面是我的 mongoDb 中的 venue collection 的示例:

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

我还有一个event collection:

{
    "_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 object 吗? 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 设为事件集合中的字符串 event_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'
     }
}])

当您使用 mongoose 时,您不需要使用 _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 过滤该列表以仅显示与该地点相关的事件