我在MongoDB数据库中有文件夹,视频和访问集合。文件夹可以有几个视频(一对多)和视频可以有几个访问(一对多)。我想找到其中视频有特定访问权限的文件夹。
我使用$elemMatch
像Folder.find({videos: {$elemMatch: {access: {$in: <AccessInstance>}}}})
,然后也尝试以下技术Folder.find({"videos.access": {$in: <AccessInstance>}})
,但他们都不为我工作。
下面是我的模型结构和关系:
@Schema()
export class Folder {
_id: string;
@Prop({ type: [mongoose.Schema.Types.ObjectId], ref: 'Video' })
videos: Video[];
// other properties..
}
@Schema()
export class Video{
_id: string;
@Prop({ type: [mongoose.Schema.Types.ObjectId], ref: 'Access' })
access: Access[];
// other properties..
}
@Schema()
export class Access{
_id: string;
// other properties..
}
在Mongoose中,这种任务的解决方案是什么?
1条答案
按热度按时间hkmswyz61#
您的Schemas有一些问题。您在所有3个Schemas中将
_id
字段定义为_id: string;
,但随后将其引用为ObjectId
,例如{ type: [mongoose.Schema.Types.ObjectId], ref: 'Video' }
。如果没有解决方案,这些字段将无法进行比较。由于你似乎在使用Nest.js和mongoose,我的建议是从你的每个Schemas中删除
_id
字段定义。除非你想将_id
字段定义为除了ObjectId
之外的任何东西,当然,我认为你没有。Mongoose会自动将_id
定义为ObjectId
,所以你可以删除这些行。有了这个变化,为了找到一个
Folder
,其中有Videos
,其中有特定的Access
,你需要使用aggregate来做videos
数组的$lookup
。这将允许你搜索videos.access
数组以寻找匹配。没有$lookup
,access
数组在每个数组中没有上下文。videos
数组元素。换句话说,access
数组还不存在于每个Folder
文档中。给定一个
Access
文档,它具有以下_id
值:字符串
您的合计将是:
型
请参阅HERE以获取工作示例。