标准 URI 连接语法:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
参数说明:
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:最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点。 |
db.createCollection(name, option) 创建集合
参数说明:
name 要创建集合名称
option参数说明:
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为true时,必须指定size参数。 |
autolndexld | 布尔 | (可选)如为true,自动在 _id 字段创建索引。默认为false。 |
size | 数值 | (可选)为固定集合指定一个最大值(以字节计) 如果 capped 为true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
例如:
db.createCollection("mycol", {
capped: true,
autoIndexId: true,
size: 6142800,
max: 10000
})
db.集合名称.insert(document文档)
例如:
db.col.insert({
title: 'MongoDB',
description: 'MongoDB 是一个 Nosql 数据库',
by: 'FRD',
url: 'http://www.frd.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
db.集合名.update(
< query > ,
< update > ,
{
upsert: < boolean > ,
multi: < boolean > ,
writeConcern: < document >
}
)
参数说明:
例如:
db.col.update({
'title': 'MongoDB'
}, {
$set: {
'title': 'MongoDB'
}
}, {
multi: true
})
如上,更新语句中用到了 $set ,以下对修改器进行说明
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 >
}
)
参数说明:
例如:
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) 返回一个文档
参数说明:
如果需要以易读的方式来读取数据,可以使用 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
}
操作 | 格式 | 范例 | 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 |
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
}
使用关键字 $or:[]
db.col.find(
{
$or: [
{
key1: value1
},
{
key2: value2
}
]
}
).pretty()
例:
db.col.find({
$or: [{
"by": "FRD"
}, {
"title": "MongoDB"
}]
}).pretty()
类比 SQL where likes > 50 AND (by = ‘FRD’ OR title = 'MongoDB '),例:
db.col.find({
"likes": {
$gt: 50
},
$or: [{
"by": "FRD"
}, {
"title": "MongoDB"
}]
}).pretty()
如果需要读取指定数量的数据,可以使用 limit 来实现,如下:
db.COLLECTION_NAME.find().limit(NUMBER)
如果需要跳过指定数量的数据,可以使用 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的通过连接索引的字段名和排序顺序生成一个索引名称。 |
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"}}}]) |