声明:这是一份查看指令的文档而不是教程,对于一些不多用的操作不录入。
假设MongoDB路径为:E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10
E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10\bin\mongod.exe --dbpath E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10\data
E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10\bin\mongo.exe
E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10\bin\mongo.exe localhost:port/db -u user -p password
需要管理员权限打开cmd
E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10\bin\mongod.exe --bind_ip 0.0.0.0 --logpath E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10\data\logs\mongodb.log --logappend --dbpath E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10\data\db --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install
应用特征 | YES / NO |
---|---|
应用不需要事务及复杂 join 支持 | 必须 Yes |
新应用,需求会变,数据模型无法确定,想快速迭代开发 | ? |
应用需要2000-3000以上的读写QPS(更高也可以) | ? |
应用需要TB甚至 PB 级别数据存储 | ? |
应用发展迅速,需要能快速水平扩展 | ? |
应用要求存储的数据不丢失 | ? |
应用需要99.999%高可用 | ? |
应用需要大量的地理位置查询、文本查询 | ? |
如果上述有1个 Yes,可以考虑 MongoDB,2个及以上的 Yes,选择 MongoDB 绝不会后悔。
shell默认使用64位浮点型数值,如下:
db.collection.insert({x:3.1415926})
db.collection.insert({x:3})
我们可以使用NumberInt或者NumberLong表示整数:
db.collection.insert({x:NumberInt(10)})
db.collection.insert({x:NumberLong(12)})
db.collection.insert({x:"hello MongoDB!"})
正则表达式主要用在查询里边,查询时我们可以使用正则表达式,语法和JavaScript中正则表达式的语法相同,比如查询所有key为x,value以hello开始的文档且不区分大小写:
db.collection.find({x:/^(hello)(.[a-zA-Z0-9])+/i})
db.collection.insert({x:[1,2,3,4,new Date()]})
MongoDB支持Date类型的数据,可以直接new一个Date对象:
db.collection.insert({x:new Date()})
一个文档也可以作为另一个文档的value:
db.sang_collect.insert({name:"三国演义",author:{name:"罗贯中",age:99}});
我们每次插入一条数据系统都会自动帮我们插入一个_id
键,这个键的值不可以重复,它可以是任何类型的,我们也可以手动的插入,默认情况下它的数据类型是ObjectId,由于MongoDB在设计之初就是用作分布式数据库,所以使用ObjectId可以避免不同数据库中_id
的重复(如果使用自增的方式在分布式系统中就会出现重复的_id
的值)。
ObjectId使用12字节的存储空间,每个字节可以存储两个十六进制数字,所以一共可以存储24个十六进制数字组成的字符串,在这24个字符串中,前8位表示时间戳,接下来6位是一个机器码,接下来4位表示进程id,最后6位表示计数器。
二进制数据的存储不能在shell中操作
db.sang_collect.insert({x:function f1(a,b){return a+b;}});
use db:如果数据库不存在,则创建数据库,否则切换到指定数据库。只有在内容插入后才会真正创建
show dbs:显示所有数据的列表。
db :用于查看当前操作的文档(数据库)
db.dropDatabase():删除当前数据库
db.createCollection(“collection”, {name, options):创建capped collections
db.runCommand({convertToCapped:“collection”,size:10}):将一个普通集合转为一个固定集合
options 可以是如下参数:
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 |
autoIndexId | 布尔 | (可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
size | 数值 | (可选)为固定集合指定一个最大值(以字节计)。 如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
举例:db.createCollection(“mycoll”, {capped:true,autoIndexId:true,size:100000,max:1000})
在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
db.collection.drop():删除集合
show tables:查看全部集合
show collections:查看全部集合
db.collection.insert({x:10}):往集合中插入文档
update:更新文档
db.collection.update(
,
,
{
upsert: ,
multi: ,
writeConcern:
}
)
参数 | 说明 |
---|---|
query | update的查询条件,类似sql update查询内where后面的。 |
update | update的对象和一些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后面的 |
upsert | (可选)这个参数的意思是,如果不存在update的记录,会新建一个文档并插入update的数据,true为插入,默认是false,不插入。 |
multi | (可选)mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。 |
writeConcern | (可选)抛出异常的级别。 |
save:传入文档以替换已有文档
db.collection.save(
,
{
writeConcern:
}
)
参数 | 说明 |
---|---|
document | 文档数据。 |
writeConcern | 可选,抛出异常的级别。 |
db.collection.find(query, projection)
参数 | 说明 |
---|---|
query | (可选)使用查询操作符指定查询条件 |
projection | (可选)使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。 |
举例:db.collection.find({key1:value1, key2:value2}).pretty(),多个条件用逗号隔开
db.collection.find():查看集合内的文档
db.collection.find().pretty():格式化查看集合内的文档
db.collection.find({“title” : {$type : 2}}):获取 “collection” 集合中 title 为 String 的数据
db.collection.find({“title” : {$type : ‘string’}}):获取 “collection” 集合中 title 为 String 的数据
db.collection.find().limit(number):限制 “collection” 集合读取的数据记录条数为number条
db.collection.find().skip(number):跳过 “collection” 集合的前number条数据记录
db.collection.find().sort({KEY:1}):对数据进行排序,1 为升序排列, -1 为降序排列
db.collection.find({},{x:1}):查找文档返回指定数据,参数1表示返回某一个字段,0表示不返回某一个字段,当我们设置只返回x的时候,_id
默认还是返回的,如果不想返回_id
,我们可以设置_id
为0
db.collection.find({
db.collection.find({x:/^(hello)(.[a-zA-Z0-9])+/i}):查询所有key为x,value以hello开始的文档且不区分大小写
{
{
{
{
{},{
{
db.collection.remove(
,
)
2.6版本后:
db.collection.remove(
,
{
justOne: ,
writeConcern:
}
)
参数 | 说明 |
---|---|
query | (可选)删除的文档的条件。 |
justOne | (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。 |
writeConcern | (可选)抛出异常的级别。 |
举例:db.collection.remove(document,1)
MongoDB支持简单的算数运算
db.collection.createIndex(keys, options): Key 值为要创建的索引字段,1 升序,-1为降序。如{“title”:1}。options具体参数后面可查。
db.collection.ensureIndex({:,:}):创建复合索引
db.collection.ensureIndex({:“text”}):创建全文索引
db.collection.ensureIndex({:“2d”}):创建2D索引
db.collection.ensureIndex({:“2dsphere”}):创建2D spere索引s
Parameter | Type | Description |
---|---|---|
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 | index version | 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。 |
weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 |
default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language. |
使用 hint():
可以使用 hint 来强制 MongoDB 使用一个指定的索引。
这种方法某些情形下会提升性能。 一个有索引的 collection 并且执行一个多字段的查询(一些字段已经索引了)。
举例:
db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
默认情况下,集合中的_id
字段就是索引
db.collection.getIndexes():查看指定集合中的索引
db.collection.totalIndexSize():查看指定集合中的索引的大小
db.collection.dropIndex(“xIndex”):按名称删除索引
db.collection.dropIndexes():删除所有索引
db.collection.ensureIndex({:“text”}):创建全文索引
db.collection.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: text:{search:}}):查询文档,value用空格间隔表示包含下一个单词,用-间隔表示不包含下一个单词。
db.collection.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: text:{search:}},{score:{$meta:“textScore”}}):查看查询结果的相似度
地理空间索引可以分为两类:
1、2d索引,可以用来存储和查找平面上的点。
2、2d sphere索引,可以用来存储和查找球面上的点。
2d索引
db.collection.ensureIndex({:“2d”}):创建2D索引
db.collection.find({:{ n e a r : [ 90 , 0 ] , near:[90,0], near:[90,0],maxDistance:10}}):使用 n e a r 查 询 某 一 个 点 附 近 的 点 , 默 认 是 100 个 点 。 可 以 通 过 near查询某一个点附近的点,默认是100个点。可以通过 near查询某一个点附近的点,默认是100个点。可以通过maxDistance来设置返回的最远距离:
db.collection.find({:{KaTeX parse error: Expected '}', got 'EOF' at end of input: geoWithin:{box:[[0,0],[91,1]]}}}):通过 g e o W i t h i n 查 询 某 个 形 状 内 的 点 , geoWithin查询某个形状内的点, geoWithin查询某个形状内的点,box为矩阵
db.collection.find({:{KaTeX parse error: Expected '}', got 'EOF' at end of input: geoWithin:{center:[[0,0],90]}}}):通过 g e o W i t h i n 查 询 某 个 形 状 内 的 点 , geoWithin查询某个形状内的点, geoWithin查询某个形状内的点,center为圆
db.collection.find({:{KaTeX parse error: Expected '}', got 'EOF' at end of input: geoWithin:{polygon:[[0,0],[100,0],[100,1],[0,1]]}}}):通过 g e o W i t h i n 查 询 某 个 形 状 内 的 点 , geoWithin查询某个形状内的点, geoWithin查询某个形状内的点,polygon为多边形
2d sphere索引
db.collection.ensureIndex({:“2dsphere”}):创建2D spere索引
db.collection.find({location:{KaTeX parse error: Expected '}', got 'EOF' at end of input: within:{geometry:.location}}}):查询与value区域有交集的
db.collection.find({location:{KaTeX parse error: Expected '}', got 'EOF' at end of input: near:{geometry:.location}}}):查询在value区域附件的
操作:db.collection.aggregate(options)
举例:db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : {$sum : 1}}}])
相当于:select by_user, count(*) from mycol group by by_user
聚合表达式:
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { s u m : " sum : " sum:"likes"}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { a v g : " avg : " avg:"likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { m i n : " min : " min:"likes"}}}]) |
$max | 获取集合中所有文档对应值得最大值。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { m a x : " max : " max:"likes"}}}]) |
$push | 在结果文档中插入值到一个数组中。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : { p u s h : " push: " push:"url"}}}]) |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : { a d d T o S e t : " addToSet : " addToSet:"url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", first_url : { f i r s t : " first : " first:"url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", last_url : { l a s t : " last : " last:"url"}}}]) |
管道操作:
explain():用在查询语句中,只适用于find()。explain()的用法和sort()、limit()用法差不多,不同的是explain()必须放在最后面。
举例:db.collection.find({:}).explain()
返回结果:
1、queryPlanner:查询计划
2、serverInfo:MongoDB服务的一些信息
其中各个参数的含义为:
参数 | 含义 |
---|---|
plannerVersion | 查询计划版本 |
namespace | 要查询的集合 |
indexFilterSet | 是否使用索引 |
parsedQuery | 查询条件,此处为x=1 |
winningPlan | 最佳执行计划 |
stage | 查询方式,常见的有COLLSCAN/全表扫描、IXSCAN/索引扫描、FETCH/根据索引去检索文档、SHARD_MERGE/合并分片结果、IDHACK/针对_id进行查询 |
filter | 过滤条件 |
direction | 搜索方向 |
rejectedPlans | 拒绝的执行计划 |
serverInfo | MongoDB服务器信息 |
添加参数:
除了默认的explain()之外,explain还支持输入参数
举例:explain(“queryPlanner”)
参数类型:
1、queryPlanner:默认参数,与不添加无异
2、executionStats:会返回最佳执行计划的一些统计信息,多了**“executionStats”:{…}**
3、allPlansExecution:获取所有的执行计划
其中executionStats中包含的参数有:
参数 | 含义 |
---|---|
executionSuccess | 是否执行成功 |
nReturned | 返回的结果数 |
executionTimeMillis | 执行耗时 |
totalKeysExamined | 索引扫描次数 |
totalDocsExamined | 文档扫描次数 |
executionStages | 这个分类下描述执行的状态 |
stage | 扫描方式,具体可选值与上文的相同 |
nReturned | 查询结果数量 |
executionTimeMillisEstimate | 预估耗时 |
works | 工作单元数,一个查询会分解成小的工作单元 |
advanced | 优先返回的结果数 |
docsExamined | 文档检查数目,与totalDocsExamined一致 |
explains只适用find方法,对于一些聚合查询之类的查询方法就无法统计耗时时间了。可以使用profiling来记录耗时。
开启Profiling的方法:
1、 直接在启动参数里直接进行设置。启动MongoDB时加上–profile=级别
2、在客户端调用db.setProfilingLevel(级别)
命令来实时配置。
之后便可以通过db.getProfilingLevel()
命令来获取当前的Profile级别。
Profiling
一共分为3个级别:
0
- 不开启。
1
- 记录慢命令 (默认为>100ms)
3
- 记录所有命令
设置慢命令:
1、直接在启动参数里直接进行设置。启动MongoDB时加上–slowms=毫秒数
2、db.setProfilingLevel( level , slowms)
db.system.profile.find():查询profile记录
profile 部分字段解释:
op
:操作类型
ns
:被查的集合
commond
:命令的内容
docsExamined
:扫描文档数
nreturned
:返回记录数
millis
:耗时时间,单位毫秒
ts
:命令执行时间
responseLength
:返回内容长度
var map=function(){emit(this.,this.)}
var reduce=function(key,value){return Array.sum(value)}
var options={out:"totalPrice"}
db.collection.mapReduce(map,reduce,options);
db.totalPrice.find()
emit函数主要用来实现分组,接收两个参数,第一个参数表示分组的字段,第二个参数表示要统计的数据。
reduce来做具体的数据处理操作,接收两个参数,对应emit方法的两个参数,这里使用了Array中的sum函数对price字段进行自加处理。
options中定义了将结果输出的集合。
届时我们将在这个集合中去查询数据,默认情况下,这个集合即使在数据库重启后也会保留,并且保留集合中的数据。
runCommand实现:
也可以利用runCommand命令来执行MapReduce。格式如下:
db.runCommand(
{
mapReduce: ,
map: ,
reduce: ,
finalize: ,
out:
含义如下:
参数 | 含义 |
---|---|
mapReduce | 表示要操作的集合 |
map | map函数 |
reduce | reduce函数 |
finalize | 最终处理函数 |
out | 输出的集合 |
query | 对结果进行过滤 |
sort | 对结果排序 |
limit | 返回的结果数 |
scope | 设置参数值,在这里设置的值在map、reduce、finalize函数中可见 |
jsMode | 是否将map执行的中间数据由javascript对象转换成BSON对象,默认为false |
verbose | 是否显示详细的时间统计信息 |
bypassDocumentValidation | 是否绕过文档验证 |
collation | 其他一些校对 |
创建数据存储目录:
mkdir /data/db
启动Mongo Shell:
# —nodb表示启动时不连接任何数据库
mongo --nodb
创建一个副本集:
replicaSet=new ReplSetTest({nodes:3})
在创建的日志中,我们可以看到三个实例的端口号,我这里分别是20000、20001、20002,此时我们的副本集创建好了,但是并未启动,接下来执行如下命令启动三个mongodb实例:
replicaSet.startSet()
再执行如下命令配置复制功能:
replicaSet.initiate()
这样环境基本就配好了,此时当前的shell不要关闭,我们重新打开一个Linux命令窗口,执行如下命令:
mongo 192.168.248.128:20000/collection
表示连接端口为20000的那个实例中的collection数据库,连接成功后,我们可以执行如下命令查看当前实例的身份,如下:
db.isMaster()
返回的数据很多,其中有一条是"ismaster" : true
,表示这是一个主节点,此时我们再分别打开两个Linux窗口,分别执行如下两条命令,进入另外两个节点:
mongo 192.168.248.128:20001/collection
mongo 192.168.248.128:20002/collection
连接成功之后,依然可以通过db.isMaster()
命令来查看备份节点的身份,我们发现此时"ismaster" : false
,表示这是一个备份节点,此时我们可以先做个简单的测试了,此时我在主节点(端口为20000)那个节点上写一个文档,写完之后,我们看看其他副本集成员上是否有我刚才的写的文档的副本,执行命令顺序如下:
主节点写入数据:
db.collect1.insert({x:"hahaha"})
任意一个副本节点,先执行如下命令表示可以从备份节点读取数据:
db.setSlaveOk()
然后再在备份节点中执行如下命令读取数据:
db.collect1.find()
此时,我们发现数据已经备份成功了。
如果此时我们尝试向备份节点中直接写入文档,会发现写入失败,这里需要注意备份节点中的数据都是备份来的,不可以直接写入,想写入,除非等它的身份转为主节点才可以。
此时,我们尝试通过如下命令关闭主节点:
use admin
db.shutdownServer()
然后查看两个备份节点的db.isMaster(),发现有一个备份节点自动上位成为了主节点。
最后如果想关闭副本集,可以回到第一个shell命令行中,输入如下命令:
replicaSet.stopSet()
首先准备好三台装好了MongoDB的服务器,地址分别如下:
192.168.248.128
192.168.248.135
192.168.248.136
修改每台服务器的配置文件mongodb.conf,添加replSet=rs,表示副本集的名称,修改后的配置文件内容如下:
dbpath=/opt/mongodb/db
logpath=/opt/mongodb/logs/mongodb.log
port=27017
fork=true
replSet=rs
修改完成之后,分别启动三台服务器上的MongoDB,启动成功之后,连接上任意一台的shell,连接成功之后,先定义配置文件,如下:
config={_id:"rs",members:[{_id:0,host:"192.168.248.128:27017"},{_id:1,host:"192.168.248.135:27017"},{_id:2,host:"192.168.248.136:27017"}]}
id后面跟着的是副本集的名称,也就是我们在mongodb.conf中定义的名称,后面三个是副本集的成员,定义好之后,再执行如下命令初始化副本集:
rs.initiate(config)
初始化成功之后,我们就可以通过rs.status()来查看副本集的状态,也可以看到每个服务器的角色,部分日志内容如下:
{
"members" : [
{
"_id" : 0,
"name" : "192.168.248.128:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY"
},
{
"_id" : 1,
"name" : "192.168.248.135:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"syncingTo" : "192.168.248.128:27017"
}
]
}
我们可以看到每台服务器的角色,有primary,也有secondary,secondary上还注明了从哪个服务器上同步数据。
我们可以利用如下命令删除一个副本集成员:
rs.remove('ip:port')
上面的命令执行完成后,我们可以通过rs.status()命令来查看是否删除成功:
rs.status()
也可以通过如下命令来为副本集添加一个成员:
rs.add('ip:port')
我们可以在添加节点时指定优先级:
rs.add({_id:0,host:'ip:port',priority:2})
也可以为已有的节点设置优先级:
config=rs.config()
config.members[0].priority=99
rs.reconfig(config)
当然,副本集也是可以更新的,使用reconfig命令即可,如下:
首先定义config,如下:
config={_id:"rs",members:[{_id:0,host:"ip"},{_id:1,host:"ip"}]}
然后执行更新操作:
rs.reconfig(config)
我们也可以利用config=rs.config()获取原始的config文件,然后进行修改,修改之后再执行 rs.reconfig(config),如下:
config=rs.config()
config.members[0].host="192.168.248.136"
rs.reconfig(config)
向副本集中添加仲裁者:
rs.addArb('192.168.248.128:27017')
config=rs.config()
config.members[2]={_id:2,host:'ip',arbiterOnly:true}
rs.reconfig(config)
db.getCollection(‘oplog.rs’).stats()
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | { } |
db.col.find({"by":"菜鸟教程"}).pretty() |
where by = '菜鸟教程' |
小于 | { |
db.col.find({"likes":{$lt:50}}).pretty() |
where likes < 50 |
小于或等于 | { |
db.col.find({"likes":{$lte:50}}).pretty() |
where likes <= 50 |
大于 | { |
db.col.find({"likes":{$gt:50}}).pretty() |
where likes > 50 |
大于或等于 | { |
db.col.find({"likes":{$gte:50}}).pretty() |
where likes >= 50 |
不等于 | { |
db.col.find({"likes":{$ne:50}}).pretty() |
where likes != 50 |
操作 | 格式 | 示例 |
---|---|---|
或者 | $or | {$or: [{ |
A或B包含 | $in | { |
都不包含 | $nin | { |
类型查找 | $type | { |
取反 | $not | { |
A和B包含 | $all | { |
同时比较 | $elemMatch | { |
类型 | 数字 | 备注 |
---|---|---|
Double | 1 | |
String | 2 | |
Object | 3 | |
Array | 4 | |
Binary data | 5 | |
Undefined | 6 | 已废弃。 |
Object id | 7 | |
Boolean | 8 | |
Date | 9 | |
Null | 10 | |
Regular Expression | 11 | |
JavaScript | 13 | |
Symbol | 14 | |
JavaScript (with scope) | 15 | |
32-bit integer | 16 | |
Timestamp | 17 | |
64-bit integer | 18 | |
Min key | 255 | Query with -1 . |
Max key | 127 |
var newObject = ObjectId():定义唯一主键
newObject.getTimestamp():查看文档的时间戳
newObject.str:ObjectId转字符串输出
newObject.toString():ObjectId转字符串输出
$set:可以用来修改一个字段的值,如果这个字段不存在,则创建它。
{$set:{
$unset:可以用来删除一个字段。
{$unset:{
i n c : 用 来 增 加 已 有 键 的 值 , 如 果 该 键 不 存 在 就 新 创 建 一 个 。 注 意 inc:用来增加已有键的值,如果该键不存在就新创建一个。注意 inc:用来增加已有键的值,如果该键不存在就新创建一个。注意inc只能用来操作数字,不能用来操作null、布尔等。
{$inc:{
$sort:用以排序,-1表示降序,1表示升序。
{$sort:{score:-1}}
$push:可以向已有数组末尾追加元素,要是不存在就创建一个数组。
{$push:{
$addToSet:可以向已有数组末尾追加其不存在的元素,要是不存在就创建一个数组。
{$addToSet:{
e a c h : 适 用 于 each:适用于 each:适用于addToSet操作符和$push操作符:
{$addToSet: {
{$push: {
$slice:固定数组的长度,假设我固定数组的长度为5,如果数组中的元素不足5个,则全部保留,如果数组中的元素超过5个,则只会保留最新的5个,
{$push:{
$pop:可以用来删除数组中的数据,1表示从数组的末尾删除一条数据,-1表示从数组的开头删除一条数据。
{$pop:{
$pull:按条件删除数组中的某个元素
{$pull:{
操作 | 格式 | 示例 |
---|---|---|
增加 | $add | {$add: [ |
减去 | $subtract | {$subtract:[ |
相乘 | $multiply | {$multiply:[ |
求商 | $divide | {$divide:[ |
求模 | $mod | {$mod:[ |
org.mongodb
mongodb-driver
3.5.0
首先需要一个MongoClient:
MongoClient client = new MongoClient("127.0.0.1", 27017);
然后通过如下方式获取一个数据库,如果要获取的数据库本身就存在,直接获取到,不存在MongoDB会自动创建:
MongoDatabase database = client.getDatabase("test");
然后通过如下方式获取一个名为collection的集合,这个集合存在的话就直接获取到,不存在的话MongoDB会自动创建出来,如下:
MongoCollection collection = sang.getCollection("collection");
// 登录地址
ServerAddress serverAddress = new ServerAddress("127.0.0.1", 27017);
// MongoCredential是一个凭证,第一个参数为用户名,第二个参数是要在哪个数据库中验证,第三个参数是密码的char数组,
List<MongoCredential> credentialsList = new ArrayList<MongoCredential>();
MongoCredential mc = MongoCredential.createScramSha1Credential("root","test","123456".toCharArray());
credentialsList.add(mc);
MongoClient client = new MongoClient(serverAddress,credentialsList);
// 登录地址
ServerAddress serverAddress = new ServerAddress("192.168.248.128", 27017);
// 身份凭证
List<MongoCredential> credentialsList = new ArrayList<MongoCredential>();
MongoCredential mc = MongoCredential.createScramSha1Credential("rwuser","sang","123".toCharArray());
credentialsList.add(mc);
// 配置参数设置
MongoClientOptions options = MongoClientOptions.builder()
//设置连接超时时间为10s
.connectTimeout(1000*10)
//设置最长等待时间为10s
.maxWaitTime(1000*10)
.build();
// 建立连接
MongoClient client = new MongoClient(serverAddress,credentialsList,options);
单条数据:
Document document = new Document();
document.append("name", "三国演义").append("author", "罗贯中");
collection.insertOne(document);
多条数据:
List documentList = new ArrayList();
Document d1 = new Document();
d1.append("name", "三国演义").append("author", "罗贯中");
documentList.add(d1);
Document d2 = new Document();
d2.append("name", "红楼梦").append("author", "曹雪芹");
documentList.add(d2);
collection.insertMany(documentList);
修改查到的第一条数据:
collection.updateOne(Filters.eq("author", "罗贯中"), new Document("$set", new Document("name", "三国演义123")));
修改查到的所有数据:
collection.updateMany(Filters.eq("author", "罗贯中"), new Document("$set", new Document("name", "三国演义456")));
删除查到的一条数据:
c.deleteOne(Filters.eq("author", "罗贯中"));
删除查到的所有数据:
c.deleteMany(Filters.eq("author", "罗贯中"));
直接查询所有文档:
FindIterable documents = collection.find();
for (Document value : documents) {
System.out.println(value);
}
按照条件查询:
FindIterable documents = collection.find(Filters.eq("author", "罗贯中"));
for (Document value : documents) {
System.out.println(value);
}