mongodb--菜鸟基础

一,使用MongoDB数据库表:

1,显示所有的表: show dbs

1545631076909

2, 创建数据库: use test

show dbs
admin 0.000GB
config 0.000GB
local 0.000GB

use test
switched to db test

db
test

show dbs
admin 0.000GB
config 0.000GB
local 0.000GB

db.test.insert({“user_name”:“test123”,“password”:“123456”})
WriteResult({ “nInserted” : 1 })

show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB

3,刪除 mongodb 数据库

use test

db.test()

show dbs

4,删除集合:

语法:db.collection.drop()

1545631845227

5, mongodb 创建结合

注释: MongoDB的集合相当于mysql的数据库表

语法: db.createCollection(name,options)
  • name: 要创建的集合名称
  • options: 可选参数, 指定有关内存大小及索引的选项

options 可以是如下参数:

字段类型描述
capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。
autoIndexId布尔(可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size数值(可选)为固定集合指定一个最大值(以字节计)。 如果 capped 为 true,也需要指定该字段。
max数值(可选)指定固定集合中包含文档的最大数量。
> use test
switched to db test
> db.createCollection("run")
{ "ok" : 1 }
>
1,查看已有的集合: show collections / show tables  #高版本可以使用
2,db.getCollectionInfos({name:{$regex:'test'}}) 相当于 mysql的 show tables like '%xxx%'
3,db.createCollection(name,options)

> db.createCollection("mycol", { capped : true, autoIndexId : true, size : 
    6142800, max : 10000 } )
   
4,在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
> use test                                # 选中数据库
> db.mycol2.insert({"name" : "菜鸟教程"})  #  创建集合
> show collections
mycol2

6,MongoDB 删除集合

语法: db.collection.drop()   #collection 集合名称

7,mongodb 插入文档:

语法:db.collection_name.insert(document)

实例:实例中 col 是我们的集合名,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。

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

查看已插入的文档: db.col.find()

我们也可以将数据定义为一个变量,如下所示:

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

1545634578916

插入文档你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据

  • 注意:

  • db.collection.insertOne():向指定集合中插入一条文档数据

  • db.collection.insertMany():向指定集合中插入多条文档数据

  • #  插入单条数据
    
    > var document = db.collection.insertOne({"a": 3})
    > document
    {
            "acknowledged" : true,
            "insertedId" : ObjectId("571a218011a82a1d94c02333")
    }
    
    #  插入多条数据
    > var res = db.collection.insertMany([{"b": 3}, {'c': 4}])
    > res
    {
            "acknowledged" : true,
            "insertedIds" : [
                    ObjectId("571a22a911a82a1d94c02337"),
                    ObjectId("571a22a911a82a1d94c02338")
            ]
    }
    

查看集合文档:db.collection_name.find();

1545635137269

8, MongoDB 更新文档

语法:
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'}})
    

    1545635736764

    使用参数:
    
    >db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
    

    save() 方法

    save() 方法通过传入的文档来替换已有文档。语法格式如下:

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

    参数说明:

    • document : 文档数据。

    • writeConcern :可选,抛出异常的级别。

    • 更多实例

      只更新第一条记录:

      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 );

      1. 在3.2版本开始,MongoDB提供以下更新集合文档的方法:

        • db.collection.updateOne() 向指定集合更新单个文档
        • db.collection.updateMany() 向指定集合更新多个文档

        首先我们在test集合里插入测试数据

        use test
        db.test_collection.insert( [
        {"name":"abc","age":"25","status":"zxc"},
        {"name":"dec","age":"19","status":"qwe"},
        {"name":"asd","age":"30","status":"nmn"},
        ] )
        

        更新单个文档

        > db.test_collection.updateOne({"name":"abc"},{$set:{"age":"28"}})
        { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
        > db.test_collection.find()
        { "_id" : ObjectId("59c8ba673b92ae498a5716af"), "name" : "abc", "age" : "28", "status" : "zxc" }
        { "_id" : ObjectId("59c8ba673b92ae498a5716b0"), "name" : "dec", "age" : "19", "status" : "qwe" }
        { "_id" : ObjectId("59c8ba673b92ae498a5716b1"), "name" : "asd", "age" : "30", "status" : "nmn" }
        >
        

        更新多个文档

        > db.test_collection.updateMany({"age":{$gt:"10"}},{$set:{"status":"xyz"}})
        { "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
        > db.test_collection.find()
        { "_id" : ObjectId("59c8ba673b92ae498a5716af"), "name" : "abc", "age" : "28", "status" : "xyz" }
        { "_id" : ObjectId("59c8ba673b92ae498a5716b0"), "name" : "dec", "age" : "19", "status" : "xyz" }
        { "_id" : ObjectId("59c8ba673b92ae498a5716b1"), "name" : "asd", "age" : "30", "status" : "xyz" }
        >
        
   - WriteConcern.NONE:没有异常抛出
   - WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常
   - WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
   - WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。
   - WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。
   - WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
   - WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。
   - 

   移除集合中的键值对,使用的 $unset 操作符:

   语法:

{ $unset: { : “”, … } }


如果指定的字段不存在则操作不做任何处理。

```mong
db.col.update({"_id":"56064f89ade2f21f36b03136"}, {$set:{ "test2" : "OK"}})
db.col.find()

db.col.update({"_id":"56064f89ade2f21f36b03136"}, {$unset:{ "test2" : "OK"}})
db.col.find()

## 9 删除文档

```mongodb
语法: db.collection.remove(<query>,<justone>)

如果你的 MongoDB 是 2.6 版本以后的,语法格式如下:

db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)

参数说明:

  • query :(可选)删除的文档的条件。

  • justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。

  • writeConcern :(可选)抛出异常的级别。

  • 如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:

    >db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
    

    如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):

    >db.col.remove({})
    >db.col.find()
    >
    

    remove() 方法已经过时了,现在官方推荐使用 deleteOne() 和 deleteMany() 方法。

    如删除集合下全部文档:

    db.inventory.deleteMany({})
    

    删除 status 等于 A 的全部文档:

    db.inventory.deleteMany({ status : "A" })
    

    删除 status 等于 D 的一个文档:

    db.inventory.deleteOne( { status: "D" } )
    

    remove() 方法 并不会真正释放空间。

    需要继续执行 db.repairDatabase() 来回收磁盘空间。

    > db.repairDatabase()
    或者
    > db.runCommand({ repairDatabase: 1 })
    

    10 mongoDB 查询文档

MongoDB 查询数据的语法格式如下:

db.collection.find(query, projection)
  • query :可选,使用查询操作符指定查询条件

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

  • MongoDB AND 条件

    MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。

    语法格式如下:

    >db.col.find({key1:value1, key2:value2}).pretty()
    

​ MongoDB OR 条件

#1 MongoDB OR 条件语句使用了关键字 $or,语法格式如下:

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

AND 和 OR 联合使用

db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
db.col.find({‘likes’:{$gt:50}}, {title: 1, by: 1})
  1. 补充一下 projection 参数的使用方法

    db.collection.find(query, projection)
    
    

    若不指定 projection,则默认返回所有键,指定 projection 格式如下,有两种模式

    db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的键,不返回其他键
    db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的键,返回其他键
    
    

    _id 键默认返回,需要主动指定 _id:0 才会隐藏

    两种模式不可混用(因为这样的话无法推断其他键是否应返回)

    db.collection.find(query, {title: 1, by: 0}) // 错误
    
    

    只能全1或全0,除了在inclusion模式时可以指定_id为0

    db.collection.find(query, {_id:0, title: 1, by: 1}) // 正确
    
    

    若不想指定查询条件参数 query 可以 用 {} 代替,但是需要指定 projection 参数:

   querydb.collection.find({}, {title: 1})

如果是 qty 大于 50 小于 80 不能这样写:

   db.posts.find( {  qty: { $gt: 50 }, qty: { $lt: 80 } } )

应该这样:

   db.posts.find( {  qty: { $gt: 50 ,$lt: 80}} )

11 MongoDB 条件操作符

$gt -------- greater than  >

$gte --------- gt equal  >=

$lt -------- less than  <

$lte --------- lt equal  <=

$ne ----------- not equal  !=

$eq  --------  equal  =

模糊查询

查询 title 包含"教"字的文档:

db.col.find({title:/教/})

查询 title 字段以"教"字开头的文档:

db.col.find({title:/^教/})

查询 titl e字段以"教"字结尾的文档:

db.col.find({title:/教$/})

12 $type 操作符

如果想获取 “col” 集合中 title 为 String 的数据,你可以使用以下命令:

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

查找值类型为数字的x,数字的 t y p e 为 1 字 符 串 的 type为1 字符串的 type1type为2 布尔值的$type为8

13,MongoDB Limit与Skip方法

1,语法:> db.collection_name.find().limit(number)
> db.col.find({},{"title":1,_id:0}).limit(2)
{ "title" : "PHP 教程" }
{ "title" : "Java 教程" }
> 
2,语法:>   db.collection_name.find().limit(number).skip(number)

以下实例只会显示第二条文档数据

>db.col.find({},{"title":1,_id:0}).limit(1).skip(1)   #skip从0开始
{ "title" : "Java 教程" }
>

14,MongoDB 排序

语法:> db.collection_name.find().sort({key:1})

以下实例演示了 col 集合中的数据按字段 likes 的 -1 降序排列 1升序排列:

>db.col.find({},{"title":1,_id:0}).sort({"likes":-1})  
{ "title" : "PHP 教程" }
{ "title" : "Java 教程" }
{ "title" : "MongoDB 教程" }

15,MongoDB 索引

语法: > db.collection.createIndex(keys,options)

语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。

1545804288073

createIndex() 接收可选参数,可选参数列表如下:

ParameterTypeDescription
backgroundBoolean建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。 “background” 默认值为false
uniqueBoolean建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
namestring索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
dropDupsBoolean3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.
sparseBoolean对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
expireAfterSecondsinteger指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
vindex version索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。
weightsdocument索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_languagestring对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_overridestring对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.

实例

在后台创建索引:

db.values.createIndex({open: 1, close: 1}, {background: true})

1、查看集合索引

db.col.getIndexes()

2、查看集合索引大小

db.col.totalIndexSize()

3、删除集合所有索引

db.col.dropIndexes()

4、删除集合指定索引

db.col.dropIndex("索引名称")

16,MongoDB 聚合

语法: db.collection_name.aggregate(aggregate_operation)
> 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
}
>

以上实例类似sql语句:

 select by_user, count(*) from mycol group by by_user

在上面的例子中,我们通过字段 by_user 字段对数据进行分组,并计算 by_user 字段相同值的总和。

下表展示了一些聚合的表达式:

表达式描述实例
$sum计算总和。db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { s u m : &quot; sum : &quot; sum:"likes"}}}])
$avg计算平均值db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { a v g : &quot; avg : &quot; avg:"likes"}}}])
$min获取集合中所有文档对应值得最小值。db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { m i n : &quot; min : &quot; min:"likes"}}}])
$max获取集合中所有文档对应值得最大值。db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { m a x : &quot; max : &quot; max:"likes"}}}])
$push在结果文档中插入值到一个数组中。db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : { p u s h : &quot; push: &quot; push:"url"}}}])
$addToSet在结果文档中插入值到一个数组中,但不创建副本。db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : { a d d T o S e t : &quot; addToSet : &quot; addToSet:"url"}}}])
$first根据资源文档的排序获取第一个文档数据。db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", first_url : { f i r s t : &quot; first : &quot; first:"url"}}}])
$last根据资源文档的排序获取最后一个文档数据db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", last_url : { l a s t : &quot; last : &quot; last:"url"}}}])

管道的概念

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。

表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。

这里我们介绍一下聚合框架中常用的几个操作:

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

管道操作符实例

1、$project实例

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

这样的话结果中就只还有_id,tilte和author三个字段了,默认情况下_id字段是被包含的,如果要想不包含_id话可以这样:

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

2.$match实例

db.articles.aggregate( [
                        { $match : { score : { $gt : 70, $lte : 90 } } },
                        { $group: { _id: null, count: { $sum: 1 } } }
                       ] );

m a t c h 用 于 获 取 分 数 大 于 70 小 于 或 等 于 90 记 录 , 然 后 将 符 合 条 件 的 记 录 送 到 下 一 阶 段 match用于获取分数大于70小于或等于90记录,然后将符合条件的记录送到下一阶段 match7090group管道操作符进行处理。

3.$skip实例

db.article.aggregate(
    { $skip : 5 });

经过$skip管道操作符处理后,前五个文档被"过滤"掉。

17,MongoDB数据备份

语法

mongodump命令脚本语法如下:

>mongodump -h dbhost -d dbname -o dbdirectory

  • -h:

    MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017

  • -d:

    需要备份的数据库实例,例如:test

  • -o:

    备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。

    实例:

    在本地使用 27017 启动你的mongod服务。打开命令提示符窗口,进入MongoDB安装目录的bin目录输入命令mongodump:

    > mongodump
    

MongoDB数据恢复

mongodb使用 mongorestore 命令来恢复备份的数据。

语法

mongorestore命令脚本语法如下:

>mongorestore -h <hostname><:port> -d dbname <path>

  • –host <:port>, -h <:port>:

    MongoDB所在服务器地址,默认为: localhost:27017

  • –db , -d :

    需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2

  • –drop:

    恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!

  • mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。

    你不能同时指定 和 --dir 选项,–dir也可以设置备份目录。

  • –dir:

    指定备份的目录

    你不能同时指定 和 --dir 选项。

18,MongoDB 监控

@1,mongostat是mongodb自带的状态检测工具,在命令行下使用。它会间隔固定时间获取mongodb的当前运行状态,并输出。

D:\Program Files\MongoDB\Server\4.0\bin>  mongostat

@2,mongotop也是mongodb下的一个内置工具,mongotop提供了一个方法,用来跟踪一个MongoDB的实例,查看哪些大量的时间花费在读取和写入数据。 mongotop提供每个集合的水平的统计数据。默认情况下,mongotop返回值的每一秒。

D:\Program Files\MongoDB\Server\4.0\bin>  mongotop
D:\Program Files\MongoDB\Server\4.0\bin>  mongotop 10
D:\Program Files\MongoDB\Server\4.0\bin>  mongotop --locks
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值