--

MongoDB 的操作练习



获取虚拟机

下载数据

实际操作

1. 启动 MongoDB 服务器以及 MongoDB shell.
  $ cd Downloads/big-data-3/mongodb
  $ ./mongodb/bin/mongod --dbpath db

--dbpath db 指定了哪个数据库需要运行,而这个数据库的内容存放在一个文件夹里面。

2. 启动另外一个 terminal,运行 MongoDB shell,我们所有的操作都在 shell 中完成。

  $ cd Downloads/big-data-3/mongodb
  $ ./mongodb/bin/mongo



3. 查看 database 和 collections

  $ show dbs


我们要用到的是名字叫做 sample 的数据库。 它里面包含了很多 Twitter JSON 数据。
我们进入这个数据库。
  $ use sample
我们可以查看这个数据库下面的 collections
  >> show collections
Twitter 数据都保存在 users collection 下面。 一个collection 有点像 SQL 中的table。 我们看一下 users 下面有多少数据(也就是有多少 document)
  >> db.users.count()


4. 查看一个数据

  >> db.users.findOne()

你能发现 这个document 有多个 fields,比如 user_name, retweet_count, tweet_ID 等。 以及,对于 user,还有更深层次的 item,比如 CreateAt, UserId, Location 等等。

我们可以用 distinct 命令来获取一些 item

  >> db.users.distinct("user_name")


5. 查找,用的最多的是 find 命令, 比如我们要招 user_name 为 ActionSportsJax 的那个 item

  >> db.users.find({user_name: "ActionSportsJax"})


利用 pretty() 命令,我们更够以可读性更强的方式展现结果。

  >> db.users.find({user_name: "ActionSportsJax"}).pretty()


6. 筛选

在 find 命令可以包含两个参数,第一个表示筛选的条件,第二个表示筛选的 item

  >> db.users.find({user_name: "ActionSportsJax"}, {tweet_ID: 1})
  >> db.users.find({user_name: "ActionSportsJax"}, {tweet_ID: 1, _id: 0})
默认的,有一个 _id 会被筛选显示,你可以设置 _id:0 来丢弃它。 7. 正则匹配 利用 regex 来匹配含有通配符的表达式。 比如下面这样,你是用来查找 tweet_text 完全匹配为 FIFA 的,没有找到。
  >> db.users.find({tweet_text: "FIFA"})


但是你可以检索包含有 FIFA 字眼的,利用通配符表达式。

  >> db.users.find({tweet_text: /FIFA/})


我们可以用 count() 对 find 的结果统计数目。

  >> db.users.find({tweet_text: /FIFA/}).count()


8. 利用文本索引 text index。 可以创建一个文本索引,用来加速查找,以及允许更加高级的查找 我们先来创建一个 index 索引,用 createIndex() 命令就好。

  >> db.users.createIndex({"tweet_text": "text"})


这样我们对 tweet_index 创建了 text 索引,叫做 text

9. 利用我们已经建立好的索引,我们进一步进行检索。 注意这里的 search 相当于 /FIFA/

  >> db.users.find({$text:{$search: "FIFA"}}).count()


我们同时可以做相反的事情,返回哪些不匹配的。 比如包含 FIFA 但是不包含 Texas 的

  >> db.users.find({$text:{$search:"FIFA -Texas"}}).count()


10. 其他的逻辑表达式,比如 与 或 非等等。以及 逻辑判断符号,>,<,==, >=, <= 等等。

  >> db.users.find({tweet_mentioned_count: {$gt: 6}})


$gt 表示 >, $lt 表示 <,下面就是返回那些数据,他的twette_mentioned_count 大于 它的 tweet_followers_count

  >> db.users.find({$where: "this.tweet_mentioned_count>this.tweet_followers_count"}).count()


当然也可以加上更加复杂的逻辑表达式咯。

  >> db.users.find({$and: [{tweet_text:/FIFA/}, {tweet_mentioned_count: {$gt: 4}}]}).count()