egg
egg copied to clipboard
目前egg-mongoose对model的加载机制不能很好适配跨库关联查询
代码示例
// 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
@atian25 你好,有解题思路建议吗😂
@xjchenhao 试试修改 ref: User ==> ref: 'User', 不需要写 const User = app.mongooseDB.get('app').models.user, 记住在定义user schema时,写的必须是return conn.model('User', schema);
@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'是可以展开的。