mongodb 第3章 基本操作 mongodb 第3章 基本操作

2022-07-18

①、创建数据库

> use runoob
switched to db runoob> db
runoob

如果你想查看所有数据库,可以使用 show dbs 命令:

> show dbs
admin   0.000GB
local   0.000GB

可以看到,我们刚创建的数据库 runoob 并不在数据库的列表中, 要显示它,我们需要向 runoob 数据库插入一些数据。

> db.runoob.insert({"name":"lulublog"})
WriteResult({ "nInserted" : 1 })
> show dbs
local   0.078GB
runoob  0.078GB
test    0.078GB

数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串。

  • 不能是空字符串("")。

  • 不得含有' '(空格)、.、$、/、\和\0 (空字符)。

  • 应全部小写。

  • 最多64字节。

有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。

  • admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。

  • local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合

  • config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

②、删除数据库

db.dropDatabase()

③、创建集合

db.createCollection(name, options)
  • name: 要创建的集合名称

  • options: 可选参数, 指定有关内存大小及索引的选项

options 可以是如下参数:

https://file.lulublog.cn/images/3/2022/08/k065W75sN0xqXw4snxvNN44s474NZW.png

在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。

合法的集合名

  • 集合名不能是空字符串""。

  • 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。

  • 集合名不能以"system."开头,这是为系统集合保留的前缀。

  • 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。 

在 test 数据库中创建 runoob 集合:

> use test
switched to db test
> db.createCollection("runoob")
{ "ok" : 1 }

如果要查看已有集合,可以使用 show collections 命令:

> show collections
runoob

下面是带有几个关键参数的 createCollection() 的用法:

创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。

> db.createCollection("mycol", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } )
{ "ok" : 1 }

在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。

> db.mycol2.insert({"name" : "lulublog"})
> show collections
mycol2
...

④、删除集合

>db.mycol2.drop()
true

⑤、插入文档

文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON。

MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:

db.COLLECTION_NAME.insert(document)

需要注意的是:

  • 文档中的键/值对是有序的。

  • 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。

  • MongoDB区分类型和大小写。

  • MongoDB的文档不能有重复的键。

  • 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

文档键命名规范:

  • 键不能含有\0 (空字符)。这个字符用来表示键的结尾。

  • .和$有特别的意义,只有在特定环境下才能使用。

  • 以下划线"_"开头的键是保留的(不是严格要求的)。

实例

db.col.insert({title: "MongoDB 教程", 
    description: "MongoDB 是一个 Nosql 数据库",
    by: "lulublog",
    url: "https://www.lulublog.cn",
    tags: ["mongodb", "database", "NoSQL"],
    likes: 100
})

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

查看已插入文档:

> db.col.find()
{ "_id" : ObjectId("5bcd8e0a7fe06bde247f4c96"), "title" : "MongoDB ..", "description" : "MongoDB ... Nosql ...", "by" : "lulublog", "url" : "https://www.lulublog.cn", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }

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

document=({title: "MongoDB 教程", 
    description: "MongoDB 是一个 Nosql 数据库",
    by: "lulublog",
    url: "https://www.lulublog.cn",
    tags: ["mongodb", "database", "NoSQL"],
    likes: 100
});

执行后显示结果如下:

{
    title: "MongoDB 教程", 
    description: "MongoDB 是一个 Nosql 数据库",
    by: "lulublog",
    url: "https://www.lulublog.cn",
    tags: ["mongodb", "database", "NoSQL"],
    likes: 100
}

执行插入操作:

> db.col.insert(document)
WriteResult({ "nInserted" : 1 })

3.2 版本后还有以下几种语法可用于插入文档

  • 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")
    ]
}

⑥、更新文档

MongoDB 使用 update() 和 save() 方法来更新集合中的文档。

A、update() 方法

update() 方法用于更新已存在的文档。语法格式如下:

db.collection.update(
   ,
   ,
   {
     upsert: ,
     multi: ,
     writeConcern:    }
)

参数说明:

  • query : update的查询条件,类似sql update查询内where后面的。

  • update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的

  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。

  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

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

我们通过 update() 方法来更新标题(title)

>db.col.update({"title":"MongoDB 教程"},{$set:{"title":"MongoDB"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })   # 输出信息

可以看到标题(title)由原来的 "MongoDB 教程" 更新为了 "MongoDB"。

以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。

db.col.update({"title":"MongoDB 教程"},{$set:{"title":"MongoDB"}},{multi:true})

只更新第一条记录:

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 )

B、save() 方法

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

db.collection.save(
   ,
   {
     writeConcern:    }
)

参数说明:

  • document : 文档数据。

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

以下实例中我们替换了 _id 为 56064f89ade2f21f36b03136 的文档数据:

>db.col.save({
    "_id" : ObjectId("56064f89ade2f21f36b03136"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一个 Nosql 数据库",
    "by" : "lulublog",
    "url" : "https://www.lulublog.cn",
    "tags" : [
            "mongodb",
            "NoSQL"
    ],
    "likes" : 110
})

⑦、删除文档

MongoDB remove()函数是用来移除集合中的数据。

在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。

remove() 方法的基本语法格式如下所示:

db.collection.remove(
   ,
   {
     justOne: ,
     writeConcern:    }
)

参数说明:

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

  • justOne : (可选)如果设为 true 或 1,则只删除一个文档。

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

我们移除 title 为 'MongoDB 教程' 的文档:

db.col.remove({"title":"MongoDB 教程"})

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

db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

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

db.col.remove({})

⑧、查询文档

find() 方法以非结构化的方式来显示所有文档。

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

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

如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:

db.col.find().pretty()

pretty() 方法以格式化的方式来显示所有文档。

A、除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。

B、MongoDB 与 RDBMS Where 语句比较

如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:

https://file.lulublog.cn/images/3/2022/08/jeSemaIAEleEeiMWw9Bybd5S9GFGbS.png

  • gt -------- greater than  >

  • gte --------- gt equal  >=

  • lt -------- less than  <

  • lte --------- lt equal  <=

  • ne ----------- not equal  !=

  • eq  --------  equal  =

C、MongoDB AND 条件

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

db.col.find({key1:value1, key2:value2}).pretty()
db.col.find({"by":"lulublog", "title":"MongoDB"}).pretty()

以上实例中类似于 WHERE 语句:WHERE by='菜鸟教程' AND title='MongoDB 教程'

D、MongoDB OR 条件

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

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

以下实例中,我们演示了查询键 by 值为 lulublog 或键 title 值为 MongoDB 教程 的文档。

db.col.find({$or:[{"by":"lulublog"},{"title": "MongoDB 教程"}]}).pretty()

E、AND 和 OR 联合使用

以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: 'where likes>50 AND (by = 'lulublog' OR title = 'MongoDB 教程')'

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

F、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})

G、模糊查询

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

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

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

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

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

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

H、$type 操作符

$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。

MongoDB 中可以使用的类型如下表所示:

https://file.lulublog.cn/images/3/2022/08/li30a11JYvO8vi0Z7j0o0o0ii0IgiB.png

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

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

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

I、Limit与Skip方法

Limit() 方法

如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。

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

注:如果你们没有指定limit()方法中的参数则显示集合中的所有数据。

Skip() 方法

我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

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

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

注:skip()方法默认参数为 0 。

J、sort() 方法

sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

db.COLLECTION_NAME.find().sort({KEY:1})
db.col.find({},{"title":1,_id:0}).sort({"likes":-1})

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开微信扫一扫,即可进行扫码打赏哦

阅读 540