egg icon indicating copy to clipboard operation
egg copied to clipboard

目前egg-mongoose对model的加载机制不能很好适配跨库关联查询

Open xjchenhao opened this issue 4 years ago • 3 comments

代码示例

// app/model/testOpenDataSource.js

'use strict';

const mongoose = require('mongoose');

module.exports = app => {

  const User = app.mongooseDB.get('app').models.crm_user;

  const schema = new mongoose.Schema({

    // 创建人
    user: {
      type: mongoose.SchemaTypes.ObjectId,
      ref: User,
      required: true,
    },
    value: { type: Number },

    createTime: { type: Date, default: Date.now },
    updateTime: { type: Date, default: Date.now },
  }, {
    usePushEach: true,
    timestamps: { createdAt: 'createTime', updatedAt: 'updateTime' },
  });

  const conn = app.mongooseDB.get('card');

  return conn.model('test_open_data_source', schema);
};

问题描述

我这边想做跨库的表关联查询,通过在model中设置ref实现关联关系,此时ref获取的是app.mongooseDB.get('app').models.crm_user的model对象,是可以获取到的。此时上述语句没有问题的,且运行通过。通过await ctx.model.TestOpenDataSource.find().populate('user')可成功展开显示另外一个数据库的user表的数据。

但是我真正想获取的是user表而不是crm_user,这个时候app.mongooseDB.get('app').models中还没有挂载user表进来。

我通过打断点发现app.mongooseDB.get('app').models的挂在顺序是按照首字母的顺序的,当前文件testOpenDataSource.js是t开头的,所以crm_user已挂载,但是user在t后面,还没有挂载进来。

总不能为了让user.js可以提前挂载把它改名成auser.js吧?

mongoose跨库关联查询的官方介绍:https://mongoosejs.com/docs/populate.html#cross-db-populate

xjchenhao avatar May 13 '20 07:05 xjchenhao

@atian25 你好,有解题思路建议吗😂

xjchenhao avatar May 26 '20 03:05 xjchenhao

@xjchenhao 试试修改 ref: User ==> ref: 'User', 不需要写 const User = app.mongooseDB.get('app').models.user, 记住在定义user schema时,写的必须是return conn.model('User', schema);

vidding avatar Jul 17 '20 04:07 vidding

@xjchenhao 试试修改 ref: User ==> ref: 'User', 不需要写 const User = app.mongooseDB.get('app').models.user, 记住在定义user schema时,写的必须是return conn.model('User', schema);

不行,我还尝试性地写了ref:'user'、ref:'users'、ref:‘Users’,都不行哦。

ps: 如果是自己本表地,我知道写ref:'user'是可以展开的。

xjchenhao avatar Jul 30 '20 09:07 xjchenhao