MongoDB 的表上怎么做 JOIN?

关注者
28
被浏览
39,054

5 个回答

SQL 和 NoSQL 数据库之间最大的区别之一是 JOIN。虽然 MongoDB 推出 $lookup 作为 NoSQL 数据库中使用关系数据时的一种补充,但即使是很简单的两表关联,用 $lookup 也需要替换成复杂的聚合查询,实际应用环境错综复杂,当遇到数据多层嵌套和多表关联,$lookup 很难解决。其实如果使用 Open-esProc ,先通过 MongoDB 简单查询,再结合 SPL 语法(类 SQL 的计算),不仅能完成 SQL 的全部功能,而且特别擅长处理多层数据。举个例子,两关联表数据如下。

History:

_id id History child_id
1 001 today worked ch001
2 002 Working ch004
3 003 now working ch009

childsgroup:

_id gid name childs
1 g001 group1 {"id":"ch001","info":{"name":"a",mobile:1111}},{"id":"ch002","info":{"name":"b",mobile:2222}}
2 g002 group1 {"id":"ch004","info":{"name":"c",mobile:3333}},{"id":"ch009","info":{"name":"d",mobile:4444}}

表History中的child_id与表childsgroup中的childs.id关联,希望得到下面结果:

{
    "_id" : ObjectId("5bab2ae8ab2f1bdb4f434bc3"),
    "id" : "001",
    "history" : "today worked",
    "child_id" : "ch001",
    "childInfo" : 
         "name" : "a",
        "mobile" : 1111
   ………………
}

用 MongoDB 查询实现如下:

db.history.aggregate([
    {$lookup: {
        from:   "childsgroup",
        let: {child_id:   "$child_id"},
       pipeline: [
            {$match: {   $expr: { $in: [ "$$child_id", "$childs.id"] } } },
            {$unwind:   "$childs"},
            {$match: {   $expr: { $eq: [ "$childs.id", "$$child_id"] } } },