Mongodb基础操作

来源:互联网 发布:淘宝掌柜名能改吗 编辑:程序博客网 时间:2024/06/15 19:12

Mongodb基础操作

 

1、  下载mongodb,下载地址:https://www.mongodb.com/download-center#community,这里使用的是mongodb3.4.2版本进行讲解

2、  安装

下载后双击该文件,按操作提示安装即可。

安装过程中,你可以通过点击 "Custom(自定义)" 按钮来设置你的安装目录。


3、  在mongodb的安装路径下,新建一个data目录,在data目录中再新建一个db目录,用于存放数据库的数据文件(因为这些目录mongodb安装后不会自动创建,所以需要手动创建)

 

4、  启动mongodb服务,有两种方式:

1) 进入mongodb安装目录中的bin目录(或者也可以配置环境变量,这样就可以在任何目录下执行mongodb的命令了),执行mongod.exe文件,如:

mongod.exe --dbpath c:\data\db   这里的路径是自己创建存放数据文件的路径

 

2)  将MongoDB服务器作为Windows服务运行(创建服务后,以后方便些)

使用管理员权限打开cmd,执行如下命令:

mongod.exe --bind_ip yourIPadress --logpath"C:\data\dbConf\mongodb.log" --logappend --dbpath"C:\data\db" --port yourPortNumber --serviceName"YourServiceName" --serviceDisplayName "YourServiceName" –install

上面这段配置,需要根据自己的环境,更改yourIPadress、logpath、yourPortNumber 、dbpath、serviceName、serviceDisplayName的值

下面为mongodb启动的参数说明:

--bind_ip     绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP

--logpath    定MongoDB日志文件,注意是指定文件不是目录

--logappend        使用追加的方式写日志

--dbpath     指定数据库路径

--port 指定服务端口号,默认端口27017

--serviceName   指定服务名称

--serviceDisplayName        指定服务名称,有多个mongodb服务时执行。

--install       指定作为一个Windows服务安装。

 

         一个修改好了的完整的配置:

         mongod.exe--bind_ip localhost --logpath "D:\Program Files\MongoDB\data\dbConf\mongodb.log"--logappend --dbpath "D:\Program Files\MongoDB\data\db" --port 27017--serviceName "mongodb" --serviceDisplayName "mongodb" –install

 

5、  登录mongodb

1)在dos窗口中,输入mongo即可

2)如果设置了密码或者端口等信息,那么就需要使用如下语法来连接

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

mongodb://这是固定的格式,必须要指定。

username:password@可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登陆这个数据库

host1 必须的指定至少一个host,host1 是这个URI唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。

portX 可选的指定端口,如果不填,默认为27017

/database如果指定username:password@,连接并验证登陆指定数据库。若不指定,默认打开admin数据库。

?options 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对name=value,键值对之间通过&或;(分号)隔开

 

6、  创建数据库

通过执行命令:use DATABASE_NAME,会创建一个数据库,并选择该数据库

如果你想查看所有数据库,可以使用 show dbs 命令

 

7、  删除数据库

1)  首选先要用user 数据库名称命令选择一个数据库

2)  通过db.dropDatabase()命令,就会把当前选择的数据库进行删除

 

8、  创建集合(这里的集合相当于表)

db.createCollection(name, options) 是用来创建集合

在命令中, name 是要创建的集合的名称.Options 是一个文件,用于指定配置的集合

参数 类型         描述

Name         String        要创建的集合名称

Options     Document        (可选)指定有关内存大小和索引选项

选项​​参数是可选的,所以只需要到指定的集合名称。以下是可以使用的选项列表:

 

字段 类型         描述

capped      Boolean   (可选)如果为true,则启用封顶集合。封顶集合是固定大小的集合,会自动覆盖最早的条目,当它达到其最大大小。如果指定true,则需要也指定尺寸参数。

autoIndexID      Boolean   (可选)如果为true,自动创建索引_id字段的默认值是false。

size   number    (可选)指定最大大小字节封顶集合。如果封顶如果是 true,那么你还需要指定这个字段。

max   number    (可选)指定封顶集合允许在文件的最大数量。

 

另外,在执行insert、update、find时,如果集合不存在,则会自动创建

 

9、  删除集合

执行命令:db.COLLECTION_NAME.drop(),COLLECTION_NAME是集合名称

 

10、             插入数据

1)使用use 选择一个数据库

2)db.COLLECTION_NAME.insert(document),COLLECTION_NAME相当于表名称,document是要插入的数据,是一个类似json格式的数据

如:

db.col.insert({title:'MongoDB 教程',

    description: 'MongoDB 是一个 Nosql 数据库',

    by: '菜鸟教程',

    url: 'http://www.runoob.com',

    tags: ['mongodb', 'database', 'NoSQL'],

    likes: 100

})

3)  也可以写循环插入:

for(i=3;i<100;i++)db.sanyang_collection.insert({name:i})

 

11、             查询

1)  选择一个数据库

2)  使用db.col.find()命令进行查询(col相当于是表的名称)

3)  执行db.col.find().pretty()可以把查询的结果进行格式化显示(col相当于是表的名称)

4)  分页db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER),limit代表取出多少条数据,skip代表跳过多少条数据

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

 1 为升序排列,而-1是用于降序排列

6)  db. COLLECTION_NAME.find().count() 查询总条数

7)   

 

如果你想获取"col" 集合中 "likes" 大于 100 的数据,你可以使用以下命令

db.col.find({"likes": {$gt : 100}})

如果你想获取"col"集合中"likes" 大于等于 100 的数据,你可以使用以下命令:

db.col.find({likes: {$gte : 100}})

如果你想获取"col"集合中"likes" 小于 150 的数据,你可以使用以下命令:

db.col.find({likes: {$lt : 150}})

如果你想获取"col"集合中"likes" 小于等于 150 的数据,你可以使用以下命令:

db.col.find({likes: {$lte : 150}})

如果你想获取"col"集合中"likes" 大于100,小于 200 的数据,你可以使用以下命令:

db.col.find({likes: {$lt :200, $gt : 100}})

 

如果想获取 "col"集合中 title 为 String 的数据,你可以使用以下命令

db.col.find({"title": {$type : 2}})

类型

数字

备注

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

 

 

 

 

 

12、             修改

1)  语法:

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 :可选,抛出异常的级别。

 

实例,把title为“MongoDB教程”的值,改成“MongoDB”:

db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})

 

如果在更新是,不添加$set,那么会把这一条的所有列数据直接替换成指定值,

所以以防其他列数据丢失,需要添加$set

 

2)  MongoDB默认将只更新单一的文件,来更新多个你需要设置参数置'multi' 为true

如:db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'NewMongoDB Tutorial'}},{multi:true})

 

13、             删除

语法:

db.collection.remove(

   <query>,

   <justOne>

)

MongoDB 是 2.6 版本以后的,语法格式如下

db.collection.remove(

   <query>,

   {

     justOne: <boolean>,

     writeConcern: <document>

   }

)

 

参数说明:

query :(可选)删除的文档的条件。

justOne :(可选)如果设为 true 或 1,则只删除一个文档。

writeConcern :(可选)抛出异常的级别。

 

         实例,把col集合中title为MongoDB 教程的数据全部删除:

         db.col.remove({'title':'MongoDB教程'})

 

14、             聚合

功能类似sql语句中的 count(*)

语法:db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

实例:

db.mycol.aggregate([{$group : {_id : "$by_user",num_tutorial : {$sum : 1}}}])

表达式

描述

实例

$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"}}}])

 

管道操作略,可参考:http://www.runoob.com/mongodb/mongodb-aggregate.html

 

15、             索引

查看索引:

db.sanyang_collection.getIndexes()表示查看已存在的索引

 

索引分类:

MongDB的索引分为以下几种类型:单键索引、复合索引、多键索引、过期索引、地理空间索引、全文本索引和哈希索引

 

单键索引(Single FieldIndexes)

在一个键上创建的索引就是单键索引,单键索引是最常见的索引,如MongoDB默认创建的_id的索引就是单键索引

 

创建单键索引语法:

db.COLLECTION_NAME.ensureIndex({KEY:1})

语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可

实例:

db.col.ensureIndex({"title":1})

 

多键索引:

ensureIndex() 方法中你也可以设置使用多个字段创建索引

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

 

过期索引:

1)在一段时间后会过期的索引

2)在索引过期后,相应的数据会被删除

3)适用于存储过一段时间后会失效的数据,如:微信登录票据

4)建立方法:

   db.集合名.ensureIndex({time:1}, {expireAfterSeconds:30})

然后执行db.集合名.insert({time:new Date()})插入一条数据进行测试,等待30秒后看会不会自动删除(但是好像删除的最小时间是30秒,是1分钟,所以应该会等1分钟后才会删除)

                   过期索引的限制

                   1)创建过期索引的字段必须是ISODate类型或ISODate类型数组,不能使用时间戳

2)如果指定了ISODate数组,则按照最小的时间删除

3)过期索引不能是复合索引

4)删除时间是不精确的(不一定刚好是指定时间到了就会立马删除)

 

全文索引

全文检索对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。

MongoDB 从 2.4 版本开始支持全文检索,目前支持15种语言(暂时不支持中文)的全文索引。

启用全文检索: MongoDB 在 2.6 版本以后是默认开启全文检索的,如果你使用之前的版本,你需要使用以下代码来启用全文检索

启用命令如下:

db.adminCommand({setParameter:true,textSearchEnabled:true})

或者

mongod--setParameter textSearchEnabled=true

 

索引创建实例如下:

先插入测试数据,插入下面 posts 集合的文档数据,包含了文章内容(post_text)及标签(tags)

db.posts.insert({"post_text": "enjoy the mongodb articles on Runoob",

   "tags": ["mongodb",  "runoob"] })

db.posts.insert({"post_text": "enjoy the mongodb yourself",

   "tags": [ "mongodb"] })

db.posts.insert({"post_text": "enjoy the mongodb on Sanyang",

   "tags": ["mongodb",  "Sanyang"] })

db.posts.insert({"post_text": "enjoy the game at home",

   "tags": [ "game"] })

 

创建索引:

我们可以对 “post_text” 字段建立全文索引,这样我们可以搜索文章内的内容

db.posts.ensureIndex({post_text:"text"})

 

测试:

现在我们已经对 post_text 建立了全文索引,我们可以搜索文章中的关键词 runoob:

db.posts.find({$text:{$search:"runoob"}})

 查找含有runoob的内容

 

db.posts.find({$text:{$search:"enjoythe mongodb"}})

表示查找含有 enjoy 或 the 或 mongo 的内容

 

db.posts.find({$text:{$search:"enjoythe --mongodb"}})    

-- 是不包含的意思,表示查找含有enjoy或the 但不包含mongodb的内容

 

db.posts.find({$text:{$search:"\"enjoy\"\"the\" \"mongodb\""}})  

表示既包含enjoy 又包含the 还包含mongodb 的内容

 

全文索引的相似度查询:

$meta 操作符写法:{score:{$meta:”textScore”}}

写在查询条件后面可以返回结果的相似度

如:

db.posts.find({$text:{$search:"enjoythe mongodb"}}, {score:{$meta:"textScore"}})

也可以与sort() 一起使用,可以对越相似的越靠前:

db.posts.find({$text:{$search:"enjoythe mongodb"}}, {score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}})

 

全文索引的限制:

1)每次查询只能指定一个$text查询

2)全文索引不支持中文

 

 

删除全文索引:

db.posts.dropIndex("post_text_text")

 

 

地理空间索引(GeospatialIndexes and Queries)

将经纬度点位存储在mongodb中,创建索引后,可以按照位置来查找其他点位

地理位置索引分类:

2d索引,用于存储和查找平面上的点

2dsphere 索引, 用于查找和存储球面上的点

2d索引:

查找方式:

1. 查找距离某一点一定距离的点

2. 查找包含在某区域内的点

 

位置表示方式:[经度,纬度]

取值范围:经度[-180,180]  纬度[-90, 90]

创建方式:

> db.集合.ensureIndex({字段名:”2d”}) 

 

实例:

先插入测试数据:

向location集合插入 下面几个经纬度数据

db.location.insert({w:[1,1]})

db.location.insert({w:[1,2]})

db.location.insert({w:[2,2]})

db.location.insert({w:[2,3]})

db.location.insert({w:[22,32]})

db.location.insert({w:[42,52]})

查询方式:

$near查询:查询距离某点最近的点,默认返回100最近的点

如:db.location.find({w:{$near:[1,1]}})默认返回100最近的点

也可以使用$maxDistance做最远距离限制

db.location.find({w:{$near:[1,1], $maxDistance:10}})

 

 

$geoWithin查询:查询某个形状的点

            形状的类型:

$box :矩形

使用方法: {$box:[[<x1>, <y1>] , [<x2>, <y2>]]}

   x1,y1 表示矩形的左上角, x2, y2 表示矩形右下角

$box使用方法:

db.location.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}})

 

$center: 圆形

使用方法: {$center:[[<x1>, <y1>] , r ]]} 

   x1,y1 表示圆形的中心点, r 表示半径

$center使用方法:

db.location.find({w:{$geoWithin:{$center:[[0,0],2]}}})

 

$polygon: 多边形

使用方法: {$center:[[<x1>, <y1>] , [<x2>, <y2>],[<x3>, <y3>, ... ]]]} 

   x, y 表示每个边的点位

使用方法与上面相似,具体例子略过

                  2dsphere 索引:

                            球面地理位置索引

创建方式:db.集合.ensureIndex({字段名:”2dsphere”})

位置表示方式:

GeoJSON:描述一个点,一条直线,多边形等形状

格式: {type:””,coordinates: [[经度,纬度]]}

type 类型有 Point、 MultiPoint、 Polygon、MultiPolygon、 LineString、 MultiLineString

查询方式与2d索引查询方式相类似,支持$minDistance和 $maxDistance

 

           测试:

插入Point数据

db.sphere.insert({name:"A",sp:{type:"Point",coordinates:[105.754484701156,41.689607057699]}})

db.sphere.insert({name:"B",sp:{type:"Point",coordinates:[105.304045248031,41.783456183240]}})

db.sphere.insert({name:"C",sp:{type:"Point",coordinates:[105.084318685531,41.389027478812]}})

db.sphere.insert({name:"D",sp:{type:"Point",coordinates:[105.831388998031,41.285916385493]}})

db.sphere.insert({name:"E",sp:{type:"Point",coordinates:[106.128706502914,42.086868474465]}})

db.sphere.insert({name:"F",sp:{type:"Point",coordinates:[105.431074666976,42.009365053841]}})

db.sphere.insert({name:"G",sp:{type:"Point",coordinates:[104.705977010726,41.921549795110]}})

geoNear查询:

db.runCommand({

   geoNear:"sphere",

   near:{type:"Point",coordinates:[105.794621276855,41.869574065014]},

    spherical:true,

    minDistance:25000,

    maxDistance:40000,

})

(1)geoNear:我们要查询的集合名称

(2)near:就是基于那个点进行搜索,这里是我们的搜索点A

(3)spherical:是个布尔值,如果为true,表示将计算实际的物理距离比如两点之间有多少km,若为false,则会基于点的单位进行计算

(4)minDistance:搜索的最小距离,这里的单位是米

(5)maxDistance:搜索的最大距离

 


哈希索引(Hashed Index)

 

哈希索引可以支持相等查询,但是哈希索引不支持范围查询。您可能无法创建一个带有哈希索引键的复合索引或者对哈希索引施加唯一性的限制。但是,您可以在同一个键上同时创建一个哈希索引和一个递增/递减(例如,非哈希)的索引,这样MongoDB对于范围查询就会自动使用非哈希的索引。

 

db.active.ensureIndex({"a":"hashed"})

 上面的操作将会在active 的 a 键上创建一个哈希索引。