如何根据 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._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
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
过滤该列表以仅显示与该地点相关的事件
在我的 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._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
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
过滤该列表以仅显示与该地点相关的事件