V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lqzhgood
V2EX  ›  数据库

求教一个 mongodb 表关联问题~

  •  
  •   lqzhgood · 2018-01-04 12:10:38 +08:00 · 1187 次点击
    这是一个创建于 2511 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有 A B C 栏目,每个栏目有 1 个视频集合。建了 4 个 collection 如下

    Program=[{name:'A',videos:***},{name:'B',videos:***},{name:'C',videos:***}]
    A_videos=[{url:xxx},{url:xxx}.......]
    B_videos=[{url:xxx},{url:xxx}.......]
    C_videos=[{url:xxx},{url:xxx}.......]
    

    A_videos, B_videos, C_videos 都已经存好数据了,可是 Program 这个 collection 搞不定。。
    我想把 Program 中每个栏目( A,B,C )中的 videos 都直接关联到相应的 collection 上( A.videos -> A_videos ),怎么写都不对。。。
    Google 到的也都是联合查询方法,建表大致都是说把 全部 videos[X].ObjecID 丢到 Program 的 videos 中。
    不能直接指定 Program[X].videos 的 key-value 为 collection 么? 求教。。。 搞了一天要疯了 T.T

    我写的 Program 参数如下 ( node / mongoose )

    const ObjectId = Schema.Types.ObjectId;
    
    
    const ProgramSchema = new mongoose.Schema({
    	name: String,
    	videos: { type: ObjectId, ref: null }
    })
    const Program = mongoose.model('Programs', ProgramSchema)
    cont PRO_LIST = [
    	{ name: 'A', vName: 'A_videos' },
    	{ name: 'B', vName: 'B_videos' },
    	{ name: 'C', vName: 'C_videos' },
    ]
    
    ProList.forEach((v) => {
    	v.vName = {
    		type: ObjectId,
    		ref: v.vName
    	}
    	Program.update({ name: v.name }, v, { upsert: true }, (err, res) => {
    		if (err) {
    			console.log('err', err)
    		} else {
    			console.log('ok', res)
    		}
    	})
    })
    
    
    
    7 条回复    2018-01-04 20:01:13 +08:00
    jakehu
        1
    jakehu  
       2018-01-04 14:05:21 +08:00
    为什么不用 MYsql 我们公司之前用的 mongodb 现在都开始转 mysql
    lovescar
        2
    lovescar  
       2018-01-04 14:13:53 +08:00
    mongoose 的文档里有关于外键的说明,你定义了嘛
    lzszone
        3
    lzszone  
       2018-01-04 14:49:57 +08:00
    没太看明白...
    如果你的想法是...视频 ABC 分别用 collection 存的话....没必要..mongodb 也的确没这个功能(也可能是我不知到)...
    mongodb 官网教程里面有关于数据库设计的章节
    我觉得你的情况可以直接将 abc_videos 里面的数据嵌套到 program 里面
    ```javascript
    const programSchema = new Schema({
    //...
    videos:[
    {//..., url: String}
    ]
    })
    ```
    也可以所有视频放一个 collection 用 objectid 关联;
    如果我没理解错你的意思的话
    为什么 abc 三个类型的视频会用三张表来保存?
    lzszone
        4
    lzszone  
       2018-01-04 14:51:03 +08:00
    完了...该用啥来写代码段?
    yanzixuan
        5
    yanzixuan  
       2018-01-04 14:56:28 +08:00
    @jakehu 你没看到 LZ 贴的代码么?现在写前端的要把后端的活也给干了。
    lqzhgood
        6
    lqzhgood  
    OP
       2018-01-04 15:33:39 +08:00
    @lzszone
    之前搞前端的,数据库设计确实不太懂。
    因为 ABC 这几组视频之间没有关联,且目前看来只会用到 时间 排序然后分页,存一起到时候查还要多一步筛选 ABC 类型。想着分开存性能可能会比较好。而且也就 ABC 三组,不会再多了。

    [也可以所有视频放一个 collection 用 objectid 关联; ]
    这个意思是 Program[A].videos 中放 A_videos 中所有 objectid 的意思么?
    更新一个视频到 A_videos,然后把这一条数据的 ObjectId push 到 Program[A].videos 中是吧?

    P.S 评论不支持 MD 语法。


    @yanzixuan 从帝都回到十八线小城市,这里都没有前端这一说,只要 [技术] ,纯前端没饭吃啊
    这边技术模式还在 CMS 写模板的阶段,前后端都没分离,算是转行把。 无奈脸 :(
    lzszone
        7
    lzszone  
       2018-01-04 20:01:13 +08:00
    @lqzhgood 如果确实不会再多,你这样做也没问题...

    既然会分页那, 直接分开查询吧那 我没啥好办法
    aggregate->$lookup 应该是不行的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5339 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:28 · PVG 15:28 · LAX 23:28 · JFK 02:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.