MongoDB 上如何实现 JOIN 运算


关键词导读:Mongodb Join  Mongodb实现Join

MongoDB属于NoSql中基于分布式文件存储的文档型数据库,这种bson格式的文档结构,更加贴近我们对物体各方面的属性描述。

MongoDB在某些方面确实比关系数据库更强,但结构化计算能力较弱(比如:JOIN/GROUP/子查询等运算支持不够友好),碰到一些复杂的运算,只能先将数据读出后再计算,而用Java等语言编写这类计算却很困难。

对于简单JOIN运算,它虽提供$lookup进行关联查询,但在实际应用场景中,想实现多表JOIN非常麻烦,脚本书写起来也并不简单,比如:两个集合JOIN,部分数据如下:

Collection1:

Collection2:

user1  user2  income

1  2  0.56

1  3  0.26

user1  user2  output

1  2  0.3

1  3  0.4

2  3  0.5

期望结果:

user1   user2   income  output

1       2       0.56    0.3

1       3       0.26    0.4

Mongo脚本需要写成如下这样:

db.c1.aggregate([

    {   "\$lookup": {

      "from": "c2",

          "localField":"user1",

          "foreignField":"user1",

          "as": "collection2_doc"

      }},

    {  "\$unwind":"\$collection2_doc"},

    {   "\$redact": {

          "\$cond": [

              {"\$eq": [ "\$user2",   "\$collection2_doc.user2"] },

              "\$\$KEEP",

              "\$\$PRUNE"

          ]

      }},

    {   "\$project": {

          "user1": 1,

          "user2": 1,

          "income": "\$income",

          "output": "\$collection2_doc. output"

      }}

      ]).pretty()

如果有集算器的协助就简单多了,它拥有完整的集合运算能力和敏捷语法体系,可以弥补MongoDB在结构化方面计算能力的不足。比如上面问题,4行就搞定了:

 

A

1

=mongo_open("mongodb://127.0.0.1:27017/raqdb")

2

=t1=mongo_shell(A1,"c1.find()").fetch(),t2=mongo_shell(A1,"c2.find()").fetch()

3

=t1.join(user1:user2,t2:user1:user2,output)

4

>A1.close()

其实还有很多情况用MongoDB处理结构化计算不太方便,但有集算器SPL的辅助却很简单,感兴趣可以参考:玩转Mongo计算简化MongoDB关联运算辅助MongoDB计算

集算器还很容易嵌入到Java应用程序中,Java如何调用SPL脚本有使用和获得它的方法。

关于集算器安装使用、获得免费授权和相关技术资料,可以参见如何使用集算器

以下是广告时间

对润乾产品感兴趣的小伙伴,一定要知道软件还能这样卖哟性价比还不过瘾? 欢迎加入好多乾计划。
这里可以低价购买软件产品,让已经亲民的价格更加便宜!
这里可以销售产品获取佣金,赚满钱包成为土豪不再是梦!
这里还可以推荐分享抢红包,每次都是好几块钱的巨款哟!
来吧,现在就加入,拿起手机扫码,开始乾包之旅



嗯,还不太了解好多乾?
猛戳这里
玩转好多乾