STF STF 之 Rethinkdb 数据库查询操作

0x88 · 2016年09月02日 · 最后由 不二 回复于 2020年04月11日 · 5045 次阅读

对于二次开发的 STF 平台的开发者来说,rethinkdb 就是个坑,网上资料都没有,写个查询语句都很费劲,有多少人狠不得把 rethinkdb 换成 mysql!!!
个人建议是:不要换 rethinkdb,学会使用 rethinkdb 后就不会想换成 mysql 了。
其实我也是一个从想把 rethinkdb 换成 mysql 的到坚持使用 rethinkdb 的人,因为 rethinkdb 确实好用。
比如:你想在数据表中增加一列数据,如果是 mysql 就行去创建一列,而在对象型数据 rethinkdb 中就可以直接插入,代码如下

var newdata = {
Asset-Num: 101,
beyond : Supperman,
....
};
r.db('stf').table('devices').get('serial').update({
detail:r.row('detail').default([]).append(newdata)})

在此你可以不用理会 newdata 里面的内容有多少,你只需要保证格式正确就可以往里面无限的插数据。

STF 平台的搭建和 Rethinkdb 的安装就不写了。直接进入主题吧。
打开 rethinkdb 的 DataExplorer, http://192.168.xx.xx:8080

先看一下 SQL 与 RQL 对应:


查询篇

以 STF 中的 “devices” 表为例子,我们要查询所有的 devices,平时我们用 SQL 语句是

select * from devices

但在 RQL 使用的就是:

r.db('stf').table('devices')

所查询出来的结果是以一个 json 保存下来的数据表,你可以用 treeview 的形式查看,当然你也可以选择以列表的查看,如下图所示:

看一下所有查询出来的结果,是否感觉太多?内嵌好多层,如果想查看某个字段的数据呢?


比如,其中 battery 里面还有数据,你只想查看到 bettery 的数据,可以直接在查询语句后面加上 ('index') 进行查询,如

r.db('stf').table('devices')('battery')

此时就只会把 battery 的信息显示出来。

查询语句的 API 里面还有 get/getAll/filter 等

  1. get:使用 primerykey 进行查询,获取到其数据
  2. getAll:需要使用第二级索引来进行查询
  3. filter:字面意思就是过滤,相当于 sql 中的 where
  4. getField:获取其中一列的内容
  5. withField:获取多个列的内容

Example:

//get
r.db('stf').table('devices').get('F8UDU15131003748')
//getAll 由于我不知道devices的列表的二级索引,所以只能拿官方的例子
r.table('marvel').getAll('man_of_steel', {index:'code_name'}).run(conn, callback)
//filter,相当于select * from devices where manufacturer in ["HUAWEI","SAMSUNG","dfdfd"]
r.db('stf').table("devices").filter(
  function (doc) {
    return r.expr(["HUAWEI","SAMSUNG","dfdfd"])
            .contains(doc("manufacturer"));
  }
)
//getField
r.db('stf').table('devices').getField('manufacturer')
//withField
r.db('stf').table('devices').withFields('serial','manufacturer','version','display')

输出来的结果大家可以去试一下,我就不在这里一一贴出来了。其实还有很多查询方法没列出来,由于早晨的空闲时间太短了,又得干活了,只能写这么多,后续有时时间再把增删改等做个分享。

共收到 16 条回复 时间 点赞

nice~~~~

0x88 #2 · 2016年09月02日 Author

#1 楼 @monkey 能不能往新话题里面增加一项 STF 框架?

匿名 #3 · 2018年04月10日

问下 stf 上如果我想通过 imei 从 rethinkdb 中取到对应的设备信息应该如何做?

匿名 #4 · 2018年04月10日

我试着使用了两个语句不过都没有生效
1、r.db('stf').table('devices').filter(
function (doc) {
return r.expr(["868058036697216",])
.contains(doc("phone.imei"));
}
)
2、r.db('stf').table('devices').filter(r.row('phone.imei').eq('868058036697216'))

0x88 #4 · 2018年04月10日 Author

应该是这样吧,如果表内有 imei 的话。r.db('stf').table('devices').getField('imei').eq('xxxxxx')

匿名 #6 · 2018年04月10日

后来又尝试了下用各种方式,发现可以获取到:r.db('stf').table('devices').filter({"phone": {
"imei": "869773027170044"
}})

还是感谢

0x88 #2 · 2018年04月10日 Author

还是把 rethinkdb 换掉吧,虽然我觉得 rethindb 还是不错的,但太少人用了。

的确,学了 rethinkdb 之后,我的 mysql 技能在飞速的退化中

请问怎么删除一个 device 信息呢?谢谢

0x88 #11 · 2018年08月06日 Author

先查到相应的 device 信息,后面+.delete()

rethinkdb 貌似没有提供命令行访问的方式?类似于 mysql 那种

仅楼主可见
0x88 #14 · 2019年06月12日 Author

我只用 stf 的后端,前端没有使用。

您好,为社么您的 devices 数据表里有那么多字段呢?我的很少呢?
希望回复,谢谢

0x88 #14 · 2020年03月19日 Author
卡卡 回复

可能部分手机还没有连接上 adb,或者没有使用过。

请问一下怎么联合查询字表的内容呢,比如我想获取"brand==“OPPO” 和 "brand==“Xiaomi” 的所有数据,

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册