Skip to content

Latest commit

 

History

History
440 lines (308 loc) · 13.4 KB

4.操作mongodb.md

File metadata and controls

440 lines (308 loc) · 13.4 KB

创建数据库

创建 mongodb 数据库的语法:

use mydb

如果数据库不存在,则创建数据库,否则切换到指定数据库。

查看所有的数据库,则使用命令 show dbs 。

MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。

在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。

删除数据库

删除 mongodb 数据库的语法:

db.dropDatabase()

需要先切换到想要删除的数据库,然后执行删除命令才行,不然删除的是默认数据库 test 。

创建集合

方法一:db.createCollection()

MongoDB 中使用 createCollection() 方法来创建集合。

db.createCollection(name, option)

参数说明:

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

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

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

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

方法二:创建集合

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

> db.mycol2.insert({"name" : "菜鸟教程"})
> show collections
mycol2
...

删除集合

MongoDB 中使用 drop() 方法来删除集合。

db.collection.drop()

如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。

插入文档

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

db.COLLECTION_NAME.insert(document)
db.COLLECTION_NAME.insertOne(document)
db.COLLECTION_NAME.insertMany([document, document, ...])

例子:

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

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

db.col.insertMany([
    {title: 'MongoDB 教程'}
    {name: '天空'}
])

更新文档

更新文档的方法有:

方法名 描述
db.col.update() 即使可能有多个文档通过过滤条件匹配到,但是也最多也只更新或者替换一个文档。
db.col.updateOne() 即使可能有多个文档通过过滤条件匹配到,但是也最多也只更新一个文档。
db.col.updateMany() 更新所有通过过滤条件匹配到的文档.
db.col.replaceOne() 即使可能有多个文档通过过滤条件匹配到,但是也最多也只替换一个文档。

update 方法

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

db.collection.update(query, update, options);

// 具体为
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 :可选,抛出异常的级别。

默认情况下, update() 方法只修改根据筛选条件匹配到的第一个文档。设置 “Multi” 选项 参数后可以批量更新匹配查询条件的所有文档记录。

在修改文档的过程中,有几个关键字:

  • $set 操作符

    例如:db.person.update({name: '张三'}, {$set: {age: 19}})

    修改名字为张三的人的年龄为19岁,其他字段不变,只修改一条记录。

  • $currentDate 操作符

    例如: db.person.update({name: '张三'}, {$set: {age: 19}, $currentDate: {lastModified: true}})

    使用 $currentDate 操作符更新 lastModified 字段的值到当前日期。如果 lastModified 字段不存在,$currentDate 会创建该字段。

  • multi: true 参数

    例如:db.person.update({name: '张三'}, {$set: {age: 19}, $currentDate: {lastModified: true}}, {multi: true})

    默认情况下只修改符合条件的一个文档,如果多个文档如何条件且都要修改只需要增加第三个参数 {multi: true} 就可以修改多个文档了

  • upsert 选项

    例如: db.person.update({name: '张三'}, {name: '张三三', age: 20, sex: '男'}, {upsert: true})

    默认情况下匹配不到更新条件的文档,update 将不做任何操作,如果增加了 {upsert: true} 参数,在没有找到匹配文档的情况下,它将插入一个新的文档。

updateOne 方法

db.collection.updateOne() 方法更新第一个根据过滤条件匹配到的文档来进行更新操作:

db.users.updateOne(
    { "favorites.artist": "Picasso" },
    {
        $set: { "favorites.food": "pie", type: 3 },
        $currentDate: { lastModified: true }
    }
)

updateMany 方法

db.collection.updateMany() 方法更新所有根据过滤条件匹配到的文档来进行更新操作:

db.users.updateMany(
   { "favorites.artist": "Picasso" },
   {
     $set: { "favorites.artist": "Pisanello", type: 3 },
     $currentDate: { lastModified: true }
   }
)

replaceOne 方法

db.collection.replaceOne() 或者 db.collection.update() 方法用来进行文档的替换,可以更换除 _id 字段外文档的整个内容。在替换文档中,由于 _id 字段是不变的,所以,你可以省略 _id 字段;不论如何,如果你包含了 _id 字段,它的值必须和当前的值相同。

下例中,使用 db.collection.replaceOne() 或 db.collection.update() 方法对 users 集合中过滤条件为 name 等于 abc 匹配到的 第一个 文档替换为新文档:

db.users.replaceOne(
    {name: 'abc'},
    {name: 'amy', age: 34, type: 2}
)

db.users.update(
    {name: 'abc'},
    {name: 'amy', age: 34, type: 2}
)

注意与下面代码的区别,区别为是否带有 $set ,如果带有 $set 则表示替换指定的部分字段,而并不替换整个文档,而不带有 $set 则表示替换为新文档。

db.users.update(
    {name: 'abc'},
    {$set: {name: 'amy', age: 34, type: 2}}
)

删除文档

删除文档的方法有:

方法名 描述
db.collection.remove() 删除满足过滤条件的一个或者所有文档
db.collection.deleteOne() 删除满足过滤条件的一个文档
db.collection.deleteMany() 删除所有匹配指定过滤条件的文档

删除所有文档

要删除所有的文档,则过滤条件为 {} :

db.collection.remove({})
db.collection.deleteMany({})

删除满足条件的所有文档

例子,删除集合中所有 status 字段等于 "A" 的文档:

db.collection.remove({ status : "A" })
db.collection.deleteMany({ status : "A" })

删除一个满足条件的文档

如下例子使用 db.collection.deleteOne() 删除第一个 status 字段等于 "A" 的文档

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

作为另一种选择,如下例子使用 db.collection.remove() 并将 参数设置为 1 来删除 第一个 status 字段等于 "A" 的文档:

db.collection.remove( { status: "D" }, 1 )

查询文档

查询文档使用的方法:

db.collection.find(query, projection)
db.collection.findOne(query, projection)

参数说明:

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

查询集合中所有的文档

db.collection.find({})

// 或者
db.collection.find()

查询满足指定过滤条件的文档

指定等于条件的方式查询

从 user 集合中检索 status 字段值为 "A" 的所有文档:

db.users.find( { status: "A" } )

使用条件查询

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

指定 AND 条件

下面的示例在 users 集合中检索 status 等于 "A" 并且 age 小于 ($lt) 30 是所有文档:

db.users.find({status: "A", age: {$lt: 30}}})

指定 OR 条件

下面的示例在 users 集合中检索 status 等于 "A" 或者 age 小于 ($lt) 30 是所有文档:

db.users.find({ $or: [{status: "A"}, {age: {$lt: 30}}]})

指定 AND 和 OR 条件

在下面的示例中,复合查询文档选择集合中 status 等于 "A" 并且 要么 age 小于 ($lt) 30 要么 type 等于 1 的所有文档:

db.users.find(
    {
        status: "A",
        $or: [{age: {$lt: 30}, {type: 1}}]
    }
)

增加修饰符的查询

修饰符有:

  • limit(NUMBER): 在符合过滤条件的文档中返回指定的条数
  • skip(NUMER): 跳过若干条数
  • sort(): 排序。1 为升序,-1 为降序

skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。

例如,查询 db 数据库中 collection 集合中年龄大于 18 的人的姓名和性别,然后按照年龄降序排列,然后取排列后的数据的前三条,然后再跳过一条数据后的集合:

db.collection.find(
    { age:{$gt:18}}, {name:1,sex:1,age:1}
)
.sort({age:-1})
.limit(3)
.skip(1)

返回查询的映射字段

映射文档限制了返回所有匹配文档的字段。映射文档可以指明包括哪些字段或者排除哪些字段。举例如下:

查找 users 集合中 status 等于 "A" 的所有文档,但是在返回结果集中,只返回匹配文档的 name, status,以及默认的 _id 字段。

db.users.find( { status: "A" }, { name: 1, status: 1 } )

如果将上述代码的 1 改为 0:

db.users.find( { status: "A" }, { name: 0, status: 0 } )

则表示,在返回的结果集中,排除掉 name 和 status 字段。

另外,如果要返回嵌入文档的某字段,可以按照下面的例子的用法来写。

下面的示例指定了一个映射,返回 _id 字段、name 字段、 status 字段以及 favorites 文档中的 food 字段, food 仍然保持嵌入在 favorites 文档中。

db.users.find(
   { status: "A" },
   { name: 1, status: 1, "favorites.food": 1 }
)

返回的结果如下(举例):

{ "_id" : 2, "name" : "bob", "status" : "A", "favorites" : { "food" : "meringue" } }
{ "_id" : 3, "name" : "ahn", "status" : "A", "favorites" : { "food" : "cake" } }
{ "_id" : 6, "name" : "abc", "status" : "A", "favorites" : { "food" : "pizza" } }

映射数组中的嵌入文档

下面的示例指明映射返回 name 字段、 status 字段,以及 points 数组的文档中包含 bonus 字段的文档。 默认返回 _id 。

db.users.find( { status: "A" }, { name: 1, status: 1, "points.bonus": 1 } )

上面的操作返回下列结果:

{ "_id" : 2, "name" : "bob", "status" : "A", "points" : [ { "bonus" : 20 }, { "bonus" : 12 } ] }
{ "_id" : 3, "name" : "ahn", "status" : "A", "points" : [ { "bonus" : 8 }, { "bonus" : 20 } ] }
{ "_id" : 6, "name" : "abc", "status" : "A", "points" : [ { "bonus" : 8 }, { "bonus" : 7 } ] }

映射返回数组中特定的数组元素

对于包含数组的字段,MongoDB提供了下面的映射操作符: $elemMatch, $slice, 以及 $ 。

下面的示例使用 $slice 映射操作符来返回 scores 数组中最后的元素。

db.user.find(
    {status: 'A'},
    {name: 1, status: 1, points: {$slice: -1}}
)

上面的操作返回下列结果:

{ "_id" : 2, "name" : "bob", "status" : "A", "points" : [ { "points" : 64, "bonus" : 12 } ] }
{ "_id" : 3, "name" : "ahn", "status" : "A", "points" : [ { "points" : 55, "bonus" : 20 } ] }
{ "_id" : 6, "name" : "abc", "status" : "A", "points" : [ { "points" : 57, "bonus" : 7 } ] }