在我的平均堆栈应用中,我有一个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._id
与event.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
过滤该列表以显示与该场所相关的事件