• mongodb设置数据关联


    一、模型关联

    来自:https://www.cnblogs.com/galaxy2490781718/p/13374749.html

    1.一对多/多对多

    在一中关联多中的字段,type为 mongoose.Schema.Types.ObjectId ,并关联关联模型的名称。ObjectId根据数据类型可换成String

    复制代码
     1 const Categoryschema = new mongoose.Schema({
     2   name: { type: String },
     3   parent: {
     4     type: mongoose.Schema.Types.ObjectId,
     5     ref: 'Category'
     6   }
     7 })
     8 
     9 const Articleschema = new mongoose.Schema({
    10   title: { type: String },
    11   body: { type: String },
    12   categories: [{
    13     type: mongoose.Schema.Types.ObjectId,
    14     ref: 'Category'
    15   }]
    16 }, {
    17   timestamps: true  // 时间戳
    18 })
    复制代码

     2.关联模型的查询

    (1)一对多查询

    从关联对象中查询

    const categories = await Category.find().populate('parent')
    console.log(categories)

    结果为一个数组,数组中的对象含有category对象

    复制代码
     1 [{
     2   __id: 5cecff6c9d129a1520c4fa9c,
     3   name: '公告',
     4   parent: {
     5     __id: 5ced0007037e041ec0560c1a,
     6     name: '新闻资讯'
     7   }
     8 }, {
     9   __id: 5cecff6d9d129a1520c4fa9d,
    10   name: '活动',
    11   parent: {
    12     __id: 5ced0008037e041ec0560c1b,
    13     name: '新闻资讯'
    14   }
    15 }]
    复制代码

    (2)多对多查询

    const articles = await Article.find().populate('category')
    console.log(articles)

    结果为数组,被关联对象字段也是一个数组,包含多个对象

    复制代码
     1 [{
     2   __id: 5cecff6c9d129a1520c4fa9c,
     3   title: 'title1',
     4   body: 'body1',
     5   categories: [ [Object], [Object] ]
     6 }, {
     7   __id: 5cecff6d9d129a1520c4fa9d,
     8   title: 'title2',
     9   body: 'body2',
    10   categories: [ [Object], [Object] ]
    11 }]
    复制代码

    3.从被关联模型中查询关联模型

    (1)设置虚拟字段

    在被关联模型中设置虚拟字段

    复制代码
     1 categorySchema.virtual('children', {  // 定义虚拟字段
     2   ref: 'Category',                               // 关联的模型
     3   localField: '_id',                          // 内键,Category模型的id字段
     4   foreignField: 'parent',               // 外键,关联模型的category字段
     5   justOne: false                            // 只查询一条数据
     6 })
     7  8 categorySchema.virtual('newsList', {
     9   ref: 'Article',
    10   localField: '_id',
    11   foreignField: 'categories',
    12   justOne: false
    13 })
    复制代码

    (2)查询

    const article = await Category.find({ name: '新闻资讯' }).populate({
    path: 'articles',
    populate: { path: 'newslist' }
    }).lean() console.log(article)

    结果表面上看起来没有其他字段的信息,但虚拟字段的内容已经包括在内了

    复制代码
     1 [{
     2   __id: 5cd3f5cf0dce1d58335b2c3f,
     3   name: '新闻资讯',
     4   children: [{
     5     __id: 5ced005cf0b6b50fe429ffdb,
     6     parent: 5cd3f5cf0dce1d58335b2c3f,
     7     name: '公告',
     8     newsList: [{
     9       __id: 5cecff6d9d129a1520c4fa9d,
    10       categories: []
    11     }]
    12   }, {
    13     ...
    14   }]
    15 }, {
    16   ...
    17 }]
  • 相关阅读:
    Vue 开发常见问题集锦
    java lambda 所有列求和
    如何解决Bat脚本中包含中文,运行乱码
    Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1428942566812653608
    mysql的时区错误问题,The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one
    Error:Execution failed for task ':app:compileDebugJavaWithJavac'
    com.android.ddmlib.adbcommandrejectedexception:未经授权的设备。
    jar包编译成 dex
    apk 查看sha1签名
    Mybatis invalid comparison: java.util.Date and java.lang.String
  • 原文地址:https://www.cnblogs.com/setbug/p/14443630.html
Copyright © 2020-2023  润新知