MongoDB的基本使用

MongoDB的基本使用

文章目录

  • 连接
  • 数据库操作
  • 集合操作
    • 创建集合
    • 其它集合操作
  • 文档操作
    • 插入文档
    • update更新文档
      • 修改器说明
    • save更新文档
    • 删除文档
    • 查询文档
      • MongoDB 与 SQL Where语句对比
      • MongoDB AND条件
      • MongoDB OR条件
      • MongoDB AND和OR联合使用
  • Limit与Skip方法
    • Limit
    • Skip
  • 排序
  • 索引
  • 聚合函数

连接

标准 URI 连接语法:

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

参数说明:

  • mongodb:// 是固定格式,不能更改
  • username:password@ 可选项,帐号和密码
  • host1 必须至少指定一个host
  • portX 可选项,指定端口,如果不填默认端口27017
  • /databse 可选项,指定连接数据库名,如果不填默认连接test数据库
  • ?options 可选项,连接选项,如果不使用 /database,则前面需要加上 /,所有连接选项都是键值对name = value, 键值对之间通过 & 或 ;隔开

option参数说明:

名称 说明
connect = dirrct | replicaSet direct: 连接方式为单个服务器。如果提供了多个主机地址,建立连接之后,按顺序访问。如果仅仅指定了一个主机,direct是默认值。
replicaSet:就和描述的那样,连接到replicaset . 这个主机地址列表,是为了发现replicaset。如果连接多个主机replicaSet是默认值。
replicaSet = name direct: 验证replicaSet的名称。 Impliesconnect=replicaSet.
slaveok = true | flase true: 对于 connect = direct 模式,驱动对列表中的而第一个服务器建立连接,即使它不是主服务器。对 connect = replicaset 模式,驱动将所有写操作发送到主节点,将所有读操作按 round robin 顺讯分发到从节点。
flase:对 connect = direct 模式,驱动按顺序尝试所有host直到找到主节点。对 connect = replicaset 模式。驱动只连接到主节点,并将所有读操作和写操都发送到主节点。
safe = true | false true:驱动在每次更新操作后都发送 getlasterror 命令以确保更新成功(参考 w 和 wtimeoutMS)
false:驱动每次更新操作后不发送 getlasterror 命令。
w = n w:代表 server 的数量 w = -1 不等待,不做异常检查 w = 0 不等待,只返回网络错误 w = 1 检查本机,并检查网络错误 w > 1 检查 w 个 server,并返回网络错误 应用与 safe = true
wtimeoutMS = ms 写操作超时的时间,应用于 safe = true
fsync = true | false 是不是等待刷新数据到磁盘,应用于 safe = true
journal = true | false 是不是等待提交的数据已经写入到日志,并刷新到磁盘,应用于 safe = true
maxPoolSize = n minPoolSize = n 一些驱动会把没用的连接关闭。然后,如果连接数低于 minPoolSize 值之下,它们不会关闭空闲的连接。注意:连接会按照需要进行创建,因此当连接池被许多连接预填充的时候,minPoolSize 不会生效。
waitQueueTimeoutMS = ms 在超时之前,线程等待连接生效的总时间。如果连接池到达最大并且所有的连接都在使用,这个参数生效。
waitQueueMultiple = n 驱动强行限制线程同时等待连接的个数。这限制了连接池的倍数。
connectTimeoutMS = ms 可以连接的时间。
socketTimeoutMS = ms 发送和接受 sockets 的时间。
ReadPreference primary:主节点,默认模式,读操作只在主节点,如果主节点不可用,报错或者抛出异常。
primaryPreferred:首选主节点,大多数情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点。
secondary:从节点,读操作只在从节点,如果从节点不可用,报错或者抛出异常。
secondaryPreferred:首选从节点,大多情况下读操作在从节点,特殊情况(如单主节点架构)读操作在主节点。
nearest:最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点。

数据库操作

  • use 数据库名 如果数据库不存在,则创建数据库,否则切换到指定数据库
  • show dbs 查看所有数据库
  • db 显示当前数据库或集合
  • db.dropDatabase() 删除当前数据库,默认为test

集合操作

创建集合

db.createCollection(name, option) 创建集合

参数说明:

name 要创建集合名称

option参数说明:

字段 类型 描述
capped 布尔 (可选)如果为true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为true时,必须指定size参数。
autolndexld 布尔 (可选)如为true,自动在 _id 字段创建索引。默认为false。
size 数值 (可选)为固定集合指定一个最大值(以字节计) 如果 capped 为true,也需要指定该字段。
max 数值 (可选)指定固定集合中包含文档的最大数量。
在插入文档时,MongoDB首先检查固定集合的size字段,然后检查max字段。

例如:

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

其它集合操作

  • show conllections 查看已经存在的集合
  • db.collection.drop() 删除集合

文档操作

插入文档

db.集合名称.insert(document文档)
例如:

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

update更新文档

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

参数说明:

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

例如:

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

修改器说明

如上,更新语句中用到了 $set ,以下对修改器进行说明

  • $inc: 对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的
    操作。
  • $set: 指定一个键并更新键值,若键不存在,则创建并更新。
  • $unset: 删除键。
  • $push: 像文档某个数组类型的键添加一个数组元素,可以添加重复元素。
    如果添加时健存在,那么键类型必须是数组,否则会报错;如果键不存在,
    则会先创建数组类型的键。
  • $ne / $addToSet: 给数组类型键值添加元素时,避免数组中产生重复数据。
  • $pop: 从数组的头部或者尾部删除数组中的元素,0和1尾部删除,-1头部删
    除。
  • $pull: 从数组中删除满足条件的元素。

save更新文档

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

例如:

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

删除文档

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

参数说明:

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

例如:

db.col.remove({
    'title': 'MongoDB 教程'
})
WriteResult({
    "nRemoved": 2
})

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

db.COLLECTION_NAME.remove(DELETION_CRITERIA, 1)

如果想删除所有数据,可以使用以下方式:

db.col.remove({})

查询文档

db.collection.find(query, projection)   返回全部文档
db.collection.findOne(query, projection)    返回一个文档

参数说明:

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

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

db.col.find().pretty()

效果:

{
    "_id": ObjectId("56063f17ade2f21f36b03133"),
    "title": "MongoDB",
    "description": "MongoDB 是一个 Nosql 数据库",
    "by": "FRD",
    "url": "http://www.frd.com",
    "tags": [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes": 100
}

MongoDB 与 SQL Where语句对比

操作 格式 范例 SQL类比语句
等于 {:} db.col.find({“by”:“FRD”}).pretty() where by = ‘FRD’
小于 {:{$lt:}} db.col.find({“likes”:{$lt:50}}).pretty() where likes < 50
小于等于 {:{$lte:}} db.col.find({“likes”:{$lte:50}}).pretty() where likes <= 50
大于 {:{$gt:}} db.col.find({“likes”:{$gt:50}}).pretty() where likes > 50
大于等于 {:{$gte:}} db.col.find({“likes”:{$gte:50}}).pretty() where likes >= 50
不等于 {:{$ne:}} db.col.find({“likes”:{$ne:50}}).pretty() where likes != 50

MongoDB AND条件

find() 可以传入多个键(key),每个键用逗号(,)隔开,即相当于 SQL 中的 AND

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

例:

db.col.find({
    "by": "FRD",
    "title": "MongoDB"
}).pretty()

{
    "_id": ObjectId("56063f17ade2f21f36b03133"),
    "title": "MongoDB",
    "description": "MongoDB 是一个 Nosql 数据库",
    "by": "菜鸟教程",
    "url": "http://www.FRD.com",
    "tags": [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes": 100
}

MongoDB OR条件

使用关键字 $or:[]

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

例:

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

MongoDB AND和OR联合使用

类比 SQL where likes > 50 AND (by = ‘FRD’ OR title = 'MongoDB '),例:

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

Limit与Skip方法

Limit

如果需要读取指定数量的数据,可以使用 limit 来实现,如下:

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

Skip

如果需要跳过指定数量的数据,可以使用 skip 来实现,如下:

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

排序

db.COLLECTION_NAME.find().sort({
    KEY: 1
})

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

例如:

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

索引

db.collection.createIndex(keys, options)

key值为要创建的索引字段,1 为按升序创建索引,-1 为按降序创建索引。

也可使用多个字段创建索引(类似关系数据库中的符合索引),例如:

db.col.createIndex({
    "title": 1,
    "description":  - 1
})

可选参数值:

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

在后台创建索引,例:

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

聚合函数

聚合管道方法又可以直接理解为合计流水线法,就是把集合里若干含数值型的文档记录,其键对应的值进行各种分类统计。aggregate 命令作用类似 SQL 语言里的 group by 语句的使用方法。

db.collection_name.aggregate([{
    $match: {
         < field > 
    }
}, {
    $group: {
         < field1 > ,
        < field2 > 
    }
}])

field 为查找条件(与 find() 中的查找条件一致),field1 为分类字段,field2 为含各种统计操作符的数值型字段,如下表:

表达式 描述 实例
$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"}}}])

你可能感兴趣的:(MongoDB)