啃掉MongoDB的过程(一)..没有标题

近来工作上有些变动,经历了一翻面试征(被)战(虐)之后,意识到了自己的威(不)猛(足)之处,排名第一的就是nosql...MongoDB方面,一问三不知,真的是很尴尬。所以本萌新决定,搞一搞这个MongoDB。

第一步:存他个1E数据进MongoDB......哦,我还没有安装。

......

emmmmm,那就先下载安装,附上链接:www.baidu.com?MongoDB Download...

以我家的网速,三分(小)钟(时)之后...就下载完成了,我下载的windows版本,直接安装,下一步下一步下一步...完成

按照官方文档(百度大法)的说法呢,要分别创建两个目录来存放数据data和日志log,我就直接创建在C盘

mkdir C:\data\db

mkdir C:\data\log

文件夹创建好之后,还要给新建一个mongo.cfg配置文件来指向它...文件名无所谓,亲(我)测(没)可(试)行(过),配置内容如下,分别指定了日志路径、日志文件和数据存放路径,其中systemLog.path为必须属性,其他配置项可参见API,比如storage.dbPath指定数据存放路径。

systemLog:
    destination: file
    path: c:\data\log\mongod.log
storage:
    dbPath: c:\data\db

然后运行mongod.exe 使用--config <configPath>为其指定配置,不过如果是这样的话,每次使用都要先启动一次这个命令,很是麻烦,我们可以直接把它安装成一个服务,只需要在后面加上一些属性

 mongod.exe --config "C:\mongodb\3.4\bin\.cfg" --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install
这样就安装成一个windows服务了。使用命令启动

net start MongoDB
终于...可以访问MongoDB看看长什么样了,通过运行mongo.exe默认会连接本机27017端口,如果Mongod服务已经启动,则可以连接进入,可以看到打印一堆通?俗?易?懂?的日志,说明我们连接成功了。connecting to :  mongodb://127.0.0.1:27017,mongodb内置的是shell命令,只要稍微看一下文档就可以弄明白命令是啥意思



首先,肯定是看一下有没有已经存在的数据库,输入db回车,就可以看到打印了一个test,为mongodb的初始数据库,然后可以选择进入该数据库进行操作,使用use <database> 命令进行切换。

>db
test
>use test
switched to db test
>
值得一提的是,如果使用use <database>进行数据库切换,输入的database为一个不存在的数据库时,MongoDB会主动为我们创建一个名为输入值的db进行切换...(手残党很容易创建一堆垃圾数据库....emmm我是不可能的).同样,如果在使用db.<collection>.insert({"a":"abc"})进行插入数据时,如果collection不存在,它也会被创建。

数据库切换已经玩过了,按照套路我们应该来玩一玩增删改查

增加

db.<collection>.insert({1:1x,...,n:nx})

<collection>为指定插入的集合(或称为数据库表)插入一个或一组key为1/n,value为1x/nx的数据,其格式为BSON,(BSON是基于JSON改造的数据格式,两者的区别大家自行百度(我不知道),成功后可使用db.<collection>.find()命令查看是否插入

>db.abcd.insert({"a":"asd"})
WriteResult({ "nInserted" : 1 })
>db.abcd.find()
{ "_id" : ObjectId("5a577e300d25f666d2516798"), "a" : "asd" }

查询

db.<collection>.find( <query filter>, <projection> )

<collection>同上,<query filter>为指定返回的文档, <projection>是一个查询映射用于指明返回匹配文档的哪些字段,你还可以随意增加一个游标修饰符来限制,跳过,排序,除非你声明.sort()方法,否则不会定义返回文档的顺序。

下面查询所有包含值为asd的a字段的集合。

>db.abcd.find(a,{a:"asd"})
{ "_id" : ObjectId("5a577e300d25f666d2516798"), "a" : "asd" }

还可以使用查询操作符来指定条件,具体的查询操作符有$eq,$in,$gt,$lt...等等,更多的看文档吧。。含义呢看一眼就能明白,等于, 包含,大于,小于等等,我们来试一试

db.getCollection('abcd').find({"a":{$in:["a","s"]}})
得到的结果肯定和上面相同,因为字符a,s都被a的值所包含,其他的操作符就不一一测试了,如果有sql基础的话,理解起来还是很容易的。如果我们存入的数据是一个多层BSON,那该怎么才能匹配到内层的值来查询呢,其实道理也是一样的,就是多层往下嵌套,我们先插入一条变态5层数据

db.getCollection('abcd').insert({
    "a":"1",
    "b":{
        "c":{
            "d":{
                "e":"f"
                }
            }
        }
})

好,我插入了一条b包含c,c包含d,d包含e,e等于f的五(四)层嵌套数据,接下来我们把e=f来当做条件查询一下。其实也很简单,有几种方式可以实现,可以像插入逻辑一样,逐层往下,也可以直接在查询字段上锁定到最内层

db.getCollection('abcd').find({"b":{"c":{"d":{"e":"f"}}}})
db.getCollection('abcd').find({"b.c.d.e":"f"})
还可以使用查询操作符 $exists模糊查询值包含f的数据,也可以直接*f*匹配模糊界限

db.getCollection('abcd').find({"b":{$exists:["f"]}})
db.abcd.find({"b":{$exists:"*f*"}})
mongodb是支持插入数组的,所以也可以玩一玩数组插入查询

db.abcd.insert({"x":[13,2,55,1,30]})

$elemMatch操作符,可以指定复合查询条件,比如查询该数组至少有一个元素满足指定多个条件的数据

db.abcd.find({"s":{$elemMatch:{$gt:29,$lte:30}}})
这样就会返回我刚插入的数组,因为它的值30满足了大于29,小于等于30.也可以直接指定数组index来查询

db.abcd.find({"s.0":{$gt:0,$lt:100}})
查询数组索引为0的元素值范围大于0小于100...

除find()外还有其他查询方法比如findOne()顾名思义,只返回一条等等。就不一一测试了。

修改

db.<collection>.updateOne({
   <update operator>: { <field1>: <value1>, ... },
   <update operator>: { <field2>: <value2>, ... },
   ...
})
我们修改一下刚才插入的a数据,随便改一个值试试

db.abcd.updateOne({"a":"1"},{$set:{"a":"2"}})
这句的意思就是检索a=1的数据,使用 $set,将a的值修改为2。

它会先检索所有满足a=1的数据,然后修改检索结果的第一行的a值为2.不仅仅是updateOne()方法,自MongoDB3.2版本以后,update()方法同样,即时满足条件的是多行数据,$set也只会修改查询结果的第一行。
当然肯定也有批量操作的api,我们使用updateMany()方法,进行多条数据同时修改,其他地方不做修改,使用updateMany()看结果,除非你打错字母,那当然全部被修改了。我就不给你看结果了。不要问我为什么.....包括其他蒂花之秀操作,replaceOne(),findOneAndReplace(),findOneAndUpdate()等等...建议都去试试。。。我真的试过了。。。

我们来看CRUD最后一个天秀操作...删库跑路

db.devCollection.remove({})
db.devCollection.deleteMany({})
这两条语句都可以达到删(删)库(除)跑(所)路(有)的目的,如果要指定条件就在{}里面写入{"cond":"value"},deleteOne()只会删除满足条件的第一行,同理deleteMany()则会删除所有满足条件的数据。还有其他操作,findOneAndDelete()查找一行并且删除,findOneAndModify()比前者多了一个排序选项,同样是删除第一行。

bulkWrite()方法可以集中批量操作增删改,比如有条件触发场景的时候就可以用上这个。都可以去试试。我这里就不试了,太多了。大家慢慢怼文档吧~

玩到这里Mongodb算是给我们开门了。能不能开门继续一探究竟呢。。。

emmm,我也不知道...下次再说吧,我是王JAVA




评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值