mongodb 如何通过嵌套关系查询单据?

sqserrrh  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(124)

我在MongoDB数据库中有文件夹,视频和访问集合。文件夹可以有几个视频(一对多)和视频可以有几个访问(一对多)。我想找到其中视频有特定访问权限的文件夹。
我使用$elemMatchFolder.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中,这种任务的解决方案是什么?

hkmswyz6

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数组以寻找匹配。没有$lookupaccess数组在每个数组中没有上下文。videos数组元素。换句话说,access数组还不存在于每个Folder文档中。
给定一个Access文档,它具有以下_id值:

const access = { _id: ObjectId("650ecb80507561a33ce927a5") }

字符串
您的合计将是:

Folder.aggregate([
  {
    "$lookup": {
      "from": "videos",
      "localField": "videos",
      "foreignField": "_id",
      "as": "videos"
    }
  },
  {
    "$match": {
      "videos.access": ObjectId("650ecb80507561a33ce927a5")
    }
  }
])


请参阅HERE以获取工作示例。

相关问题