MongoDb

前提:

  1. 进入 mongo docker
  2. mongo 命令进入 mongo 的命令操作界面

基本操作

  • 查看数据库命令
dbs
  • 创建数据库, 切换数据库,没有数据库时候创建数据库
use DATABASE_NAME
  • 删除数据库
db.dropDatabase()
  • 创建 collection, 类似 mysql 中的table
db.createCollection("table_name")
  • 向 collection 中插入数据
db.table_name.insert({"name": "alex", "age": 12})
  • 查看当前数据库中有哪些 collection
show tables
show collections
  • 删除 collection
db.table_name.drop()

创建集合

db.createCollection(name, options)
  • name: 要创建的集合名称
  • options: 可选参数, 指定有关内存大小及索引的选项
字段 类型 描述
capped 布尔 (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。
autoIndexId 布尔 (可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size 数值 (可选)为固定集合指定一个最大值,以千字节计(KB)。如果 capped 为 true,也需要指定该字段。
max 数值 (可选)指定固定集合中包含文档的最大数量。
  • 创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
db.createCollection("mycol", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } )

插入文档

db.col.insert({title: 'MongoDB 教程',
    description: 'MongoDB 是一个 Nosql 数据库',
    by: '菜鸟教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

db.col.find()

更新文档

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

query : update的查询条件,类似sql update查询内where后面的。 update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的 upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。 multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。 writeConcern :可选,抛出异常的级别。

  • 更新命令-相同的数据每次只可以修改一条记录
db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
  • 更新命令修改多行
db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}}, {multi: true})
  • save() 传入替换已有的文档

document : 文档数据。 writeConcern :可选,抛出异常的级别。

db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)

修改 _id = ObjectId("56064f89ade2f21f36b03136") 的数据

db.col.find().pretty()
{
        "_id" : ObjectId("56064f89ade2f21f36b03136"),
        "title" : "MongoDB",
        "description" : "MongoDB 是一个 Nosql 数据库",
        "by" : "Runoob",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "NoSQL"
        ],
        "likes" : 110
}
  • 格式化查找 collection 中的数据
db.col.find().pretty()

更多跟新示例

更多实例
只更新第一条记录:

db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
全部更新:

db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
只添加第一条:

db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
全部添加进去:

db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
全部更新:

db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
只更新第一条记录:

db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );

MongoDB 删除文档

  • 删除所有符合条件的数据
db.col.remove({"title":"MongoDB"})
  • 删除一条符合条件的数据
db.col.remove({"title":"MongoDB"}, 1)
  • 删除所有数据
db.col.remove({})
db.col.find().pretty()

查询文档

  • query :可选,使用查询操作符指定查询条件
  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
db.collection.find(query, projection)

where

db.col.find({key1:value1, key2:value2}).pretty()
操作 格式 范例 RDBMS中的类似语句
等于 {key:value} db.col.find({"by":"菜鸟教程"}).pretty() where by = '菜鸟教程'
小于 {key:{$lt:value}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {key:{$lte:value}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {key:{$gt:value}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {key:{$gte:value}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {key:{$ne:value}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

where and

db.col.find({key1:value1, key2:value2}).pretty()
db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"}).pretty()

where or

db.col.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()
db.col.find({$or:[{"by":"菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()

where or and and

db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()

$type 操作符号

db.col.find({"title" : {$type : 2}})
或
db.col.find({"title" : {$type : 'string'}})

limit and skip

  • limit: 限制查询数量
  • skip: 跳过多少条数据

limit

db.col.find({},{"title":1,_id:0}).limit(2)

skip

db.col.find({},{"title":1,_id:0}).limit(1).skip(1)

sort 排序

  • 1 为升序
  • -1 为降序
db.COLLECTION_NAME.find().sort({KEY:1})

索引

  • 目的:极大的提高查询效率。
  • 原因:数据库可以根据索引,整理数据(排序、红黑树、B树、B+树 等)
  • 以下将 col 表中的 title 升序排列,description 降序排列(复合索引)
  • background:true, 在后台创建索引,防止创建索引的过程中,阻塞其他数据库操作,当然还有其他的参数
  • 其他索引参数
 db.col.createIndex({"title":1,"description":-1}, {"background": true})

聚合

  • MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
  • 现在我们通过以上集合计算每个作者所写的文章数,使用aggregate()计算结果如下:
{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: 'runoob.com',
   url: 'http://www.runoob.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   _id: ObjectId(7df78ad8902d)
   title: 'NoSQL Overview', 
   description: 'No sql database is very fast',
   by_user: 'runoob.com',
   url: 'http://www.runoob.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
},
{
   _id: ObjectId(7df78ad8902e)
   title: 'Neo4j Overview', 
   description: 'Neo4j is no sql database',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
}

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
   "result" : [
      {
         "_id" : "runoob.com",
         "num_tutorial" : 2
      },
      {
         "_id" : "Neo4j",
         "num_tutorial" : 1
      }
   ],
   "ok" : 1
}

其他表达式

表达式 描述 实例
$sum 计算总和。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avg 计算平均值 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$min 获取集合中所有文档对应值得最小值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max 获取集合中所有文档对应值得最大值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$push 在结果文档中插入值到一个数组中。 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet 在结果文档中插入值到一个数组中,但不创建副本。 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first 根据资源文档的排序获取第一个文档数据。 db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last 根据资源文档的排序获取最后一个文档数据 db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])
$match 使用MongoDB的标准查询操作。 --
$limit 用来限制MongoDB聚合管道返回的文档数。 --
$skip 在聚合管道中跳过指定数量的文档,并返回余下的文档。 --
$unwind 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。 --
$group 将集合中的文档分组,可用于统计结果。 --
$sort 将输入文档排序后输出。 --
$geoNear 输出接近某一地理位置的有序文档。 --

aggregate、$match 代替 find()

db.col.aggregate([{$match:{"age":{$gt:12}}}]).pretty()

查询数量

db.module2.find().count()

通道(注意: 有待写更多的 demo)

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。 MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。 表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。

$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。 $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。 $limit:用来限制MongoDB聚合管道返回的文档数。 $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。 $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。 $group:将集合中的文档分组,可用于统计结果。 $sort:将输入文档排序后输出。 $geoNear:输出接近某一地理位置的有序文档。

db.article.aggregate(
    { $project : {
        title : 1 ,
        author : 1 ,
    }}
 );