mongo 基础知识

SQL术语/概念

MongoDB术语/概念

解释/说明

database

database

数据库

table

collection

数据库表/集合

row

document

数据记录行/文档

column

field

数据字段/域

index

index

索引

table joins

表连接,MongoDB不支持

primary key

primary key

主键,MongoDB自动将_id字段设置为主键

一、基础操作

创建数据库 use xx

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

查看所有数据库show dbs

show dbs
>admin   0.000GB
config  0.000GB
local   0.000GB

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

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

创建集合createCollection

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

options 可以是如下参数:

字段

类型

描述

capped

布尔

(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。

当该值为 true 时,必须指定 size 参数。

size

数值

(可选)为固定集合指定一个最大值,即字节数。

如果 capped 为 true,也需要指定该字段。

max

数值

(可选)指定固定集合中包含文档的最大数量。

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

例如:

我们创建一个集合空间大小1 KB, 文档最大个数为 1 个。

db.createCollection("student", { capped : true,  size : 
   1, max : 1 } )
db.student.insert({"age":133,"name":"1"})

当我们多次执行插入的时候发现数据  被覆盖。只有一条。

查看集合

show collections或show tables

1、插入操作

insert()插入一个或多个对象

db.collection.insert(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
)

参数说明:

  • document:要写入的文档,单个或多个都可以。
  • writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
  • ordered:指定是否按顺序写入,默认 true,按顺序写入。请按顺序在数组中插入文档,并且如果其中一个文档发生错误,则MongoDB将返回而不处理数组中的其余文档。如果为false,请执行无序插入,并且如果其中一个文档发生错误,请继续处理数组中的其余文档。
  • 如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。

举例1:新增一个user对象,并赋予name,age,school,hobby字段

db.user.insert({"name":"小欢","age":12,"school":"一中","hobby":["数学","唱歌","跳舞"]})

结果如下:

{
    "_id": ObjectId("5ff570f36d6f000064006096"),
    "name": "小欢",
    "age": 12,     // 显示12.0  不同的工具展示的不同
    "school": "一中",
    "hobby": [
        "数学",
        "唱歌",
        "跳舞"
    ]
}

 我们会发现会多一个_id字段,这是自动生成的,官网中这样写道:

如果文档未指定_id字段,则MongoDB将添加该_id字段并ObjectId为文档分配唯一的位置 ,然后再进行插入。大多数驱动程序会创建一个ObjectId并插入_id字段,但是 如果驱动程序或应用程序未创建,则会创建并填充_id

如果文档包含一个_id字段,则该_id值在集合中必须唯一,以避免重复的键错误。

 所以我们自己指定这个值也是可以的,如果同一个_id 插入多次会报 “duplicate key error collection”

db.user.insert({
    "_id": 002,
    "name": "小黄",
    "age": 18,
    "school": "一中",
    "hobby": ["跳舞"],
    "study": {
        "yuwen": 98,
        "shuxu": 99,
        "english": 100
    }
})

举例2:插入两个学生对象

db.user.insert([{"name":"小红","age":21,"school":"一中","hobby":["排球","唱歌","魔方"]},{"name":"小白","age":18,"school":"三中","hobby":["英语","唱歌","跳舞"]}])

insertOne()插入一条

3.2 版本之后新增了 db.collection.insertOne() 和 db.collection.insertMany()。

  • 要插入单个文档,请使用db.collection.insertOne
  • 要插入多个文档,请使用 db.collection.insertMany

 对应上面分别是:

//insertOne()
db.user.insertOne({
    "name": "小红",
    "age": 21,
    "school": "一中",
    "hobby": ["排球", "唱歌", "魔方"],
    "study": {
        "yuwen": 98,
        "shuxu": 99,
        "english": 100
    }
})

//insertMany()
db.user.insertMany([{
    "name": "小红",
    "age": 21,
    "school": "一中",
    "hobby": ["排球", "唱歌", "魔方"],
    "study": {
        "yuwen": 98,
        "shuxu": 99,
        "english": 100
    }
}, {
    "name": "小白",
    "age": 18,
    "school": "三中",
    "hobby": ["英语", "唱歌", "跳舞"],
    "study": {
        "yuwen": 98,
        "shuxu": 99,
        "english": 100
    }
}])

2、查看操作

查看基础操作

 用法如下:

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

举例1、查询年龄是18的学生,并且是“一中”的学生,并且 yuwen=98

db.getCollection('user').find({"age":21,"school":"一中","study.yuwen":98})
// where age=18 and school="一中"

举例2、查询年龄是18的学生,并且只返回name字段

              1返回   0 不返回

db.getCollection('user').find({"age":18,"school":"一中"},{"name":1})
// 1返回   0 不返回  默认也返回_id 字段,如果不想返回改字段,正确的是下面的这样
db.getCollection('user').find({"age":18,"school":"一中"},{"name":1,"_id":0})

举例3、查询年龄18的学生,并按照_id 降序 排序 ,name升序排序 。

           sort()  1 是升序,-1 是降序

db.getCollection('user').find({"age":18}).sort({"_id": -1,"name":1})
// 1 是升序,-1 是降序

举例4、查询全部

db.getCollection('user').find({})

举例5、查询前2条数据  [limit()]

db.getCollection('user').find({}).limit(2)

举例6,查询第3、第4条数据[skip()]

db.getCollection('user').find({}).skip(2).limit(2)

大小比较操作符

db.collection.find({ "field" : {  value } } );     // 等于: field = value
db.collection.find({ "field" : { $gt: value } } ); // 大于: field > value
db.collection.find({ "field" : { $lt: value } } ); // 小于: field < value
db.collection.find({ "field" : { $gte: value } } ); // 大于等于: field >= value
db.collection.find({ "field" : { $lte: value } } ); // 小于等于: field <= value
db.collection.find({ "field" : { $ne: value } } ); // 不等于: field != value

如果要同时满足多个条件,可以这样做

db.collectionName.find({ "field" : { $gt: value1, $lt: value2 } } ); // value1 < field < value2

举例:

1、请查询age大于19并且小于45的记录。

db.getCollection('user').find({ age : { $gt: 19, $lt: 45} });

关系操作符 ("$or", "$in","$nin" )

1、查询年龄 18并且是一中的

db.getCollection('user').find({"age":18,"school":"一中"})

2、查询年龄是18或者是一中的($or)

db.getCollection('user').find({$or:[{"age":18},{"school":"一中"}]})
//where age=18 or school ="一中"

3、查询年龄是15,18,19的($in)

db.getCollection('user').find({"age":{$in:[15,18,19]}})

4、查询年龄不是15的($nin)

db.getCollection('user').find({"age":{$nin:[15]}})

$size

1、查询hobby 是3个的

db.getCollection('user').find({"hobby":{$size:3}})

3、修改操作

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

  • 更新操作:  db.collection.update(query, update, options)
  • 更新单个文档:db.collection.updateOne(filter, update, options)
  • 更新多个文档:db.collection.updateMany(filter, 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 :可选,抛出异常的级别。

举例:

db.person.insert([{
     "student_no":"10003",
    "name": "小黄花0",
    "age": 11,
    "school": "一小",
    "sex": "男",
    "project": [
        {
            "name": "数学",
            "score": 122
        },
        {
            "name": "语文",
            "score": 99
        },
        {
            "name": "英语",
            "score": 109
        },
        {
            "name": "科学",
            "score": 76
        }
    ],
    "hobby": [
        "吉他",
        "跳绳",
        "编程"
    ]
},{
     "student_no":"10003",
    "name": "小黄花0",
    "age": 11,
    "school": "一小",
    "sex": "男",
    "project": [
        {
            "name": "数学",
            "score": 122
        },
        {
            "name": "语文",
            "score": 99
        },
        {
            "name": "英语",
            "score": 109
        },
        {
            "name": "科学",
            "score": 76
        }
    ],
    "hobby": [
        "吉他",
        "跳绳",
        "编程"
    ]
}])

修改举例:

//默认更新第一条

db.person.update({"student_no": "10003"},{$set:{ "age": 10,"name": "小黄花10"}});

//匹配到多条,更新多条
db.person.updateMany({"student_no": "10003"},{$set:{ "age": 14,"name": "小黄花14"}});

等价于

db.person.update({"student_no": "10003"},{$set:{ "age": 17,"name": "小黄花17"}},true,true);
 

//更新一条
db.person.updateOne({"student_no": "10003"},{$set:{ "age": 15,"name": "小黄花15"}});

等价于

db.person.update({"student_no": "10003"},{$set:{ "age": 18,"name": "小黄花18"}},true,flase);

4、删除操作

  •     删除 文档:db.collection.remove()
  •     删除单个文档 :db.collection.deleteOne()
  •     删除多个文档 :db.collection.deleteMany()

deleteOne()方法

db.collection.deleteOne(
   <filter>,
   {
      writeConcern: <document>,
      collation: <document>,
      hint: <document|string>        // Available starting in MongoDB 4.4
   }
)

参数说明:

  • filter: 使用查询运算符指定删除条件。指定一个空文档以删除集合中返回的第一个文档。
  • writeConcern :可选,抛出异常的级别。
  • collation: 可选,
  • hint: 可选

返回值:

包含以下内容的文档:
一个布尔值acknowledged,true:带有 写关注点,false:禁用了写关注点
deletedCount 包含已删除文件的数量

deleteMany()方法

db.collection.deleteMany(
   <filter>,
   {
      writeConcern: <document>,
      collation: <document>
   }
)

 举例

//删除所有匹配到的

db.person.remove({"student_no": "10003"});

//删除匹配到的第一条
db.person.deleteOne({"student_no": "10003"});

//删除匹配到的所有
db.person.deleteMany({"student_no": "10003"});