nodejs 在mongodb在跨数据库之中如何进行关联起来查询,并且支持筛选关联表的条件进行查询

发布于 2022-09-12 13:13:40 字数 2278 浏览 27 评论 0

"班级数据库": "mongodb://192.168.3.17/xxx
"学生数据库": "mongodb://192.168.3.99/xxx (只读)

使用 mongoose.createConnection 进行链接2个数据库
classId 是唯一并且不会重复的。
学生数据库是只读的,并且数量非常大,并随时可能更新。

查询主要有2个问题:

  1. mongodb://xxx , 两个不相同ip数据库如何关联起来分页查询
  2. 传入cj查询班级只返回符合条件的班级列表、并且可能有其他同时筛选班级表的条件

班级表 mongodb://192.168.3.17/xxx

{ "_id" : 1, "name" : "高二(1)班", classId:"a1"}
{ "_id" : 2, "name" : "高二(2)班", classId:"a2"}
{ "_id" : 3, "name" : "高二(3)班", classId:"a3"}

学生表 mongodb://192.168.3.99/xxx

{ "_id" : x1, classId:"a1", "user" : "张三", "cj":['88','75']}
{ "_id" : x2, classId:"a2", "user" : "李四", "cj":['88','33','99']}

直接查询班级并关联学生表的列表为

count:2,
list: [
        {
            "_id" : 1, 
            "name" : "高二(1)班", 
            classId:"a1",
            xsxx:{
                "_id" : 'x1', 
                classId:"a1", 
                "user" : "张三", 
                "cj":['88','75']
            }
        },
         {
            "_id" : 2, 
            "name" : "高二(2)班", 
            classId:"a2",
            xsxx:{
               "_id" : 'x2', 
               classId:"a2", 
               "user" : "李四", 
               "cj":['88','33','99']
            }
        },
    ]

查询条件是 cj = ['33'] 时

count: 1,
list: [
         {
            "_id" : 2, 
            "name" : "高二(2)班", 
            classId:"a2",
            xsxx:{
               "_id" : 'x2', 
               classId:"a2", 
               "user" : "李四", 
               "cj":['88','33','99']
            }
        },
    ]

我通过网络搜索的答案如下,并没有帮助到我。

$lookup: { 
    from: "学生表",             // 关联到学生表
    localField: "classId",      // 班级表关联的字段
    foreignField: "classId",    // 学生表关联的字
    as: "学生信息"
}
      

我在graphql的做法是使用resolver调用查询

班级表.addRelation('学生对象信息', {
    resolver: () => 学生表.getResolver('findOne'),
    prepareArgs: {
        filter: (source) => {
            return { classId: source.classId }
        }
    },
    projection: { openid: true }
});

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

柒七 2022-09-19 13:13:40

什么数据库可以把两个不同的实例合在一起?据我所知反正mongo不得行吧,后面可以有多个地址,那个是副本集,还是属于一个数据库。副本集与分片那也是一个数据库实例啊。

既然数据都不在一个数据库,那就只能先查班级然后再去查找学生。
如果是一个数据库,这种关联的操作符是lookup,用聚合执行。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文