快捷搜索:

MongoDB学习笔记二w88官方网站手机版

作者: w88官方网站手机版  发布:2019-05-25

数据类型

MongoDB在保留JSON基本键/值对特色的底子上,加多了别样部分数据类型。

  • 启动 & 关闭

null

null用于表示空值大概不设有的字段:{“x”:null} 

启动

布尔型

布尔类型有三个值true和false {“x”:true} 

若启动时,不钦赐别的参数, MongoDB 会私下认可使用 /data/db 目录存款和储蓄数据,我们能够动用 --dbpath 来钦点别的的不二法门,举个例子笔者动用的是底下那样的吩咐运维的:mongod --dbpath /Users/zcw/dev/MongoDB/db上边那个是自身的做事目录,直接将 MongoDB 的次第和数据库放在一同,小编便宜学习管理。

数值

shell暗中认可使用6十四人浮点型数值。 {“x”:3.1肆} 或 {“x”:三} 

对此整型值,可采取NumberInt类(表示4字节带符号整数)或NumberLong类(表示八字符带符号整数) {“x”:NumberInt(”三”)} {“x”:NumberLong(“三”)} 

我们还足以在连年数据时钦点服务器地址、端口号以及数额名等参数,比方:

字符串

utf-八字符串都得以象征为字符串类型的数据: {“x”:”foobar”} 

mongo mongo-db.xingzhewujiang.com:30000/ahaInsight

日期

日子被积攒为自新世纪以来通过的飞秒数,不存款和储蓄时区: {“x”:new Date()} 

创造日期对象时,应使用 new Date() ,而非Date(),后者重回的是日期的字符串表示,而非日期 Date对象。这一个结果与MongoDB非亲非故,是js的干活机制调整的。由于日期和字符串之间一点都不大概协作,所以进行删改查等大概全体操作时会导致众多难题。

> db.blog.insert({"x":Date()})
WriteResult({ "nInserted" : 1 })
> db.blog.find()
{ "_id" : ObjectId("584ea42d3bb80d550a5914fe"), "x" : "Mon Dec 12 2016 21:20:45 GMT 0800 (CST)" }
> db.blog.insert({"x":new Date()})
WriteResult({ "nInserted" : 1 })
> db.blog.find()
{ "_id" : ObjectId("584ea42d3bb80d550a5914fe"), "x" : "Mon Dec 12 2016 21:20:45 GMT 0800 (CST)" }
{ "_id" : ObjectId("584ea4573bb80d550a5914ff"), "x" : ISODate("2016-12-12T13:21:27.361Z") }

关闭

正则表达式

查询时,使用正则表明式作为限制条件 {“x”:/foobar/i} 

> use admin> db.shutdownServer()

数组

多少列表或数组集能够象征为数组: {“x”:[“a”,”b”,”c”]} 

数组是壹组值,它既能作为一如以前对象(如列表、栈或队列),也能当做冬日对象(如数据集)来操作。

数组中可含蓄不一致数据类型的成分 {“things”:[“pie”,3.14]} 。只固然健康的键/值对支撑的全数值都能够看作数组的值,数组中竟然足以嵌套数组。

要注意的是,那个命令只允许在地头,或是多少个经过认证的客户端。

内嵌文档

文书档案可内嵌其余文书档案,被嵌套的文书档案作为父文书档案的值: {“x”:{“foo”,”bar”}} 

利用内嵌文书档案,能够使数据协会尤其自然,不用非得存成扁平结构的键/值对。

> post={
... "user":{
... "name":"yyb",
... "address":{
... "street":"123 Park Street",
... "city":"Anytown",
... "state":"NY"
...     }
...   }
... }
{
        "user" : {
                "name" : "yyb",
                "address" : {
                        "street" : "123 Park Street",
                        "city" : "Anytown",
                        "state" : "NY"
                }
        }
}
> db.blog.insert(post)
WriteResult({ "nInserted" : 1 })
> db.blog.find()
{ "_id" : ObjectId("584ea90fce4f8e1bf30ba07d"), "user" : { "name" : "yyb", "address" : { "street" : "123 Park Street", "city" : "Anytown", "state" : "NY" } } }
  • 运行 shell

对象id

对象id是多少个12字节的ID,是文书档案的举世无双标记 {“x”:ObjectId()} 

MongoDB中存款和储蓄的文书档案必须有二个“_id”键。确定保障群集中的各类文档都能被唯壹标记。

其1键的值能够是猖獗档次的,暗许是个ObjectId对象。对象id设计成轻量型的,差别的机械都能用全局唯壹的同种方法方便的变型它。那对于在分片碰着中生成唯一的标识符特别重大。

ObjectId的前伍个字节是从典型纪元起头的光阴戳,单位为秒。那会带来一些有效的习性。

  • 时间戳,与随后的5字节结合起来,提供了秒级其他唯1性。
  • 出于时日戳在前,那代表objectid大概会按插入的顺序排列。
  • 那肆字节也含有了成立文书档案的年华。绝大许多驱动程序都会提供四个措施,用于从objectId获取这么些音讯。

接下去的三字节是所在主机的唯壹标志符。平时是机械主机名的散列值。那样就足以确认保证不一致主机生成不相同的objectId,不产生抵触。

为了确认保障在同一机器上边世的多少个经过发生的ObjectId是不二法门的,接下去的四个字节来自发生objectId的进度的经过标志符PID。

前玖字节保证了同样秒钟不相同机器差异进度暴发的ObjectId是有一无二的。末了3字节是1个自行扩张的计数器,确认保障同等进程同1秒发生的ObjectId也是不等同的。壹分钟最多允许种种进度具备25615个例外的ObjectId。

如果插入文书档案时从没“_id”键,系统会自行帮您成立一个。能够由MongoDB服务做到,但常常会在客户端由驱动程序实现。

二进制数据

贰进制数据是一个率性字节的字符串。它无法直接在shell中运用。假诺要将非utf-8字符保存在数据库中,贰进制数据是无与伦比的方法。

mongo shell

代码

查询和文书档案中得以包罗放四js代码 {“x”:function(){/*...*/}} 

此外,有三种大许多情景仅在中间接选举择(或被其余种类替代)的项目。

运维时, shell 会打字与印刷出近日 shell 的版本号,连接到了哪位库以及一些推搡新闻等,这是3个功用完备的 JavaScript 解释器,能够运作大4 JavaScript 程序,譬如利用 JavaScript 标准库只怕定义以及调用 JavaScript 函数等。

使用MongoDB shell

将shell连接受别的MongoDB实例:mongo 机器名:端口/数据库名 

上面选择本身的Linux连接作者的Windows

[root@yang mongodb]# ./bin/mongo 192.168.1.111:27017/test 
MongoDB shell version: 3.2.10
connecting to: 192.168.1.111:27017/test
Server has startup warnings: 
2016-12-12T14:14:40.558 0800 I CONTROL  [initandlisten] 
2016-12-12T14:14:40.558 0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2016-12-12T14:14:40.558 0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2016-12-12T14:14:40.558 0800 I CONTROL  [initandlisten] 
> show dbs
admin  0.000GB
local  0.000GB
test   0.000GB
> db.test.find()
> db.test.insert({"x":100})
WriteResult({ "nInserted" : 1 })
> 
> db.test.find()
{ "_id" : ObjectId("584fe47a36b03fda10897c99"), "x" : 100 }

在自家的windows中查看效果

w88官方网站手机版 1

运转时不总是其余数据库,使用 --nodb 参数运营shell,运维以往,在需求时运营new Mongo(hostname)命令就足以连接到想要的mongod了。任什么日期候都足以动用这个命令来连接受差异的数据库大概服务器。

[root@yang mongodb]# ./bin/mongo --nodb
MongoDB shell version: 3.2.10
> conn=new Mongo("192.168.1.111:27017")
connection to 192.168.1.111:27017
> db=conn.getDB("test")
test
> db.test.find()
{ "_id" : ObjectId("584fe47a36b03fda10897c99"), "x" : 100 }

Shell内置了扶持文书档案,能够选择 help 命令查看,能够通过db.help()查看数据库级其他扶持,使用db.foo.help()查看会集级其他扶植,使用db.foo.update情势查看函数的js落成代码。

> help
        db.help()                    help on db methods
        db.mycoll.help()             help on collection methods
        sh.help()                    sharding helpers
        rs.help()                    replica set helpers
        help admin                   administrative help
        help connect                 connecting to a db help
        help keys                    key shortcuts
        help misc                    misc things to know
        help mr                      mapreduce

        show dbs                     show database names
        show collections             show collections in current database
        show users                   show users in current database
        show profile                 show most recent system.profile entries with time >= 1ms
        show logs                    show the accessible logger names
        show log [name]              prints out the last segment of log in memory, 'global' is default
        use <db_name>                set current database
        db.foo.find()                list objects in collection foo
        db.foo.find( { a : 1 } )     list objects in foo where a == 1
        it                           result of the last line evaluated; use to further iterate
        DBQuery.shellBatchSize = x   set default number of items to display on shell
        exit                         quit the mongo shell
  • Shell 中的基本操作(在 shell 中查阅查看或操作数据,会用到两个基本操作:创设、读取、更新、删除,即 CRUD 操作;)

动用shell试行脚本

mongo shell会依次实行传入的台本,然后退出。

E:Program FilesMongoDBServer3.4bin>mongo js1.js
MongoDB shell version v3.4.0-rc3-7-ge24e12c
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.0-rc3-7-ge24e12c
I am yyb in the script1.js

首先:脚本的职位须位居mongo.exe 所在的目录,也正是bin目录下。其次假若布署了情形变量,直接mongo js一.js是可怜的。比方:

C:Usersyang>mongo js1.js
2016-12-13T21:25:36.265 0800 E - [main] file [js1.js] doesn't exist
failed to load: js1.js

运用钦赐的主机/端口上的mongod运营脚本,必要先内定地点,然后再跟上脚本的文件的名称。

在本子中接纳print()函数将内容输出到正式输出,那样就可以在shell中利用管道命令。假设将shell脚本的出口管道给另三个采取--quiet选项的通令,就足以让shell不打字与印刷“MongoDB shell version...”提醒。

[root@yang bin]# ./mongo --quiet 192.168.1.111:27017/test js1.js
I like to read and study

能够选取load()函数,从交互式shell中运作脚本:

> load("js1.js")
I like to read and study
true

在本子中得以访问db变量,以及其余全局变量。不过,shell协理函数(举个例子:“use db”和“show collections”)不能在文书中选取。然而,那几个扶助函数都有相应的js函数。

w88官方网站手机版 2

可以行使脚本将变量注入到shell

/**
*连接到指定的数据库,并且将db指向这个连接
*/
var connectTo=function(port,dbname){
if(!port){
port=27017;
}
if (!dbname) {
dbname="test";
}
db=connect("localhost:" port "/" dbname);
return db;
}

假定在shell中加载那些剧本,connectTo函数就足以接纳了。

> typeof connectTo
undefined
> load("defineConnectTo.js")
true
> typeof connectTo
function

除了这么些之外助长帮忙函数,仍是能够利用脚本将通用的职务和治本活动自动化。私下认可情状,shell会在运维shell时所处的目录中寻觅脚本(能够行使run(“pwd”)命令查看)。可以为shell钦点贰个相对路线大概绝对路径。

> load("/usr/local/mongodb/js1.js")
i am studing mongodb
2016-12-14T19:36:01.744 0800 I -        [thread1] shell: started program (sh6054):  pwd
sh6054| /usr/local/mongodb
true

也足以在shell中选取run()函数来施行命令行程序。能够在函数参数列表中钦赐程序所需的参数。日常来讲,这种应用办法的局限性非常的大,因为出口格式很想得到,而且不扶助管道。

> run("ls","-l","/usr/local/mongodb/")
2016-12-14T19:40:23.878 0800 I -        [thread1] shell: started program (sh6098):  ls -l /usr/local/mongodb/
sh6098| 总用量 104
sh6098| drwxrwxr-x. 2 yang yang  4096 12月 13 23:31 bin
sh6098| -rw-r--r--. 1 yang yang 34520 9月  30 18:46 GNU-AGPL-3.0
sh6098| -rw-r--r--. 1 root root    43 12月 14 19:34 js1.js
sh6098| -rw-r--r--. 1 yang yang 16726 9月  30 18:46 MPL-2
sh6098| -rw-r--r--. 1 yang yang  1359 9月  30 18:46 README
sh6098| -rw-r--r--. 1 yang yang 35910 9月  30 18:46 THIRD-PARTY-NOTICES
0

创制通过 db.createCollection() 函数能够先成立二个汇集:

创建.mongorc.js文件

倘诺有个别脚本会被频仍加载,能够将它们增加到mongorc.js文件中。那一个文件会在开发银行shell时自动运营。

Win第10中学,那一个文件所在地方: C:Usersyang ,Linux中,不领悟哪个是用户主目录,对linux不熟练。在home目录中创制了这么些文件没什么意义。

C:Windowssystem32>mongo
MongoDB shell version v3.4.0-rc3-7-ge24e12c
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.0-rc3-7-ge24e12c
Hello,i am studing mongodb// 在文件中写了print这句话
Server has startup warnings:
2016-12-12T14:14:40.558 0800 I CONTROL  [initandlisten]
2016-12-12T14:14:40.558 0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2016-12-12T14:14:40.558 0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2016-12-12T14:14:40.558 0800 I CONTROL  [initandlisten]
>

能够运用这一个本子创制一些协和索要的全局变量,也许是为太长的名字创办四个简便的别称,也能够重写内置的函数。最常见的用处之一是移除那些相比“危险”的shell援救函数。

改换数据库函数时,要确认保证同临时间对db变量和DB原型进行转移。假诺只变动了内部3个,那么db变量大概没有更动,或许那几个改动在新应用的拥有数据库中都不会收效。譬喻:

var no=function(){
    print("Not on my watch.");    
}
//禁止删除数据库
db.dropDatebase=DB.prototype.dropDatabase=no;
//禁止删除集合
DBCollection.prototype.drop=no;
//禁止删除索引
DBCollection.prototype.dropIndex=no;

1经在起步shell时钦命 --norc 参数,就足以禁止加载.mongorc.js。

能够在.mongorc.js中定制本人想要的晋升。将prompt变量设为三个字符串只怕再次来到字符串的函数。就足以重写默许的shell提醒。也能够定制八个提醒,在shell中能够自便切换。

w88官方网站手机版 3

C:Windowssystem32>mongo
MongoDB shell version v3.4.0-rc3-7-ge24e12c
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.0-rc3-7-ge24e12c
Server has startup warnings:
2016-12-12T14:14:40.558 0800 I CONTROL  [initandlisten]
2016-12-12T14:14:40.558 0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2016-12-12T14:14:40.558 0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2016-12-12T14:14:40.558 0800 I CONTROL  [initandlisten]
test>

在shell中装置EDITOPAJERO变量调用编辑器,在windows中貌似不认。

> EDITOR="/usr/bin/emacs"
> var wap=db.books.findOne({title:"war and peace"})
> edit wap

在.mongorc.js文件中增加1行EDITO凯雷德="编辑器路线";,未来就没有供给单独设了。

> db.createCollection{ "ok" : 1 }

聚拢命名注意事项

能够应用db.collectionName获取2个成团的原委,可是,借使集结名称重包含保留字或然无效的js属性名称,就分外了。

> db.test
test.test
> db.version
function () {
        return this.serverBuildInfo().version;
    }

假如集合中富含无效的js属性名称,能够选拔getCollection函数:

> db.getCollection("version")
test.version

也可以应用数组访问语法,访问以无效属性命名的集纳。

> collections=["po-sts","123comments","authors"];
[ "po-sts", "123comments", "authors" ]
> for(var i in collections){ print(db.blog[collections[i]]); }
blog.blog.po-sts
blog.blog.123comments
blog.blog.authors

insert 能够将1个文档增添到会集中:

> post = {"title": "这是一篇文章", "content": "这是文章的内容。","date" : new Date()}{ "title" : "这是一篇文章", "content" : "这是文章的内容。", "date" : ISODate("2015-04-21T02:22:52.899Z")}

那是一个实惠的 MongoDB 文书档案,所以能够用 insert 方法将其保存到集结中。

> db.blog.insertWriteResult({ "nInserted" : 1 })

进而能够选拔 find 方法寻觅那篇文章:

> db.blog.find(){ "_id" : ObjectId("5535b574b705494e688e218a"), "title" : "这是一篇文章", "content" : "这是文章的内容。", "date" : ISODate("2015-04-21T02:22:52.899Z") }可以看到我们的数据都已经完整的保存下来了,同时,MongoDB 还为我们自动生成了一个 _id 参数。

读取find 与 findOne 方法能够用于查询集合里的文档:

> db.blog.findOne(){ "_id" : ObjectId("5535b574b705494e688e218a"), "title" : "这是一篇文章", "content" : "这是文章的内容。", "date" : ISODate("2015-04-21T02:22:52.899Z")}

创新使用 update 修改博客小说,它至少接受七个参数,第多个是限量条件,第三个是新文书档案,例如大家今后要给 post 加上研商列表:

> post.comments = [][ ]

然后,用新本子的 post 替换标题为 《那是一篇小说》的小说:

> db.blog.update({"title":"这是一篇文章"},post)WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.blog.findOne(){ "_id" : ObjectId("5535b574b705494e688e218a"), "title" : "这是一篇文章", "content" : "这是文章的内容。", "date" : ISODate("2015-04-21T02:22:52.899Z"), "comments" : [ ]}可以看到,comments 已经更新到原来的那个 post 中去了。

删除使用 remove 可以去除集合中的文档,若未有别的限制参数,它将去除群集中的全数数据,也可以像下边那样,删除标题为《那是壹篇小说》的篇章:

> db.blog.remove({"title":"这是一篇文章"})WriteResult({ "nRemoved" : 1 })> db.blog.find()> 

除了交互式的运用 shell 外,大家还足以将指令保存在1个文书中,举个例子script.js ,然后利用 mongo 命令直接施行它们,叁次能够流传多少个文件名,mongo shell 会依次施行传入的剧本,然后退出:

mongo script.js script1.js

假诺希望内定主机和端口来运作方面包车型地铁台本,还足以如此做:

mongo --quiet host.name:30000/dbname script.js script1.js

—quiet 能够让 mongo shell不打字与印刷 MongoDB shell version... 那样的指示新闻。

在交互式的命令行中,还足以运用 load() 函数加载并运行脚本:

> load("script.js")i am a string printed by script.js

知道那几个以往,大家能够把部分能用的函数保存到3个文本之中,然后再将她们加载进 shell 交互分界面里面来:

创办一个名称叫 connectTo.js 的文书,内容如下:

/** * 链接到指定的数据库,然后将 db 指向这个链接 */var connectTo = function(port, dbname) { if  { port = 27017; } if  { dbname = "test" } db = connect("localhost:"   port   "/"   dbname) return db}

然后大家进去 shell :

> typeof connectToundefined> load("connectTo.js")true> typeof connectTofunction

咱俩得以选择脚本让能用的田间管理和天职自动化,比方,大家想在每三次 shell 启用时,都加载下面定义的百般函数,这一年大家能够用到四个名叫.mongorc.js 的公文。

在协和的家目录中(分裂的类别都不一致),新建一个名字为 .mongorc.js 的文件,然后写入上边这么些剧情:

print("你好,我来自 .mongorc.js 文件")

下一场,重新进入 shell:

mongoMongoDB shell version: 3.0.2connecting to: test你好,我来自 .mongorc.js 文件
  • MongoDB 客户端

shell 是贰个独门的 MongoDB客户端,运转时, shell 会连到 MongoDB 服务器的 test 数据库,并将数据库连接赋值给合局变量 db ,这一个变量是经过 shell访问 MongoDB 的着重入口点,能够动用 db 查看当前本着哪个数据库:db

而外JavaScript语法外,MongoDB 还提供了有的语法糖,以帮忙大家更加好的保管数据库,例如:

> use foobarswitched to db foobar

运营时,能够让 mongo shell 不总是别的的 mongod ,可以由此 --nodb 参数:

mongo --nodb

启航未来,我们得以在急需时实施 new Mongo 命令就足以接连到想要连接的 mongod 了:

> conn = new Mongo("host.name:30000")connection to host.name:30000> db = conn.getDBdbname

在动用 shell 的长河中,还足以每七日使用 help 命令查看协助:

help db.help() help on db methods db.mycoll.help() help on collection methods sh.help() sharding helpers rs.help() replica set helpers help admin administrative help help connect connecting to a db help help keys key shortcuts help misc misc things to know help mr mapreduce show dbs show database names show collections show collections in current database show users show users in current database show profile show most recent system.profile entries with time >= 1ms show logs show the accessible logger names show log [name] prints out the last segment of log in memory, 'global' is default use <db_name> set current database db.foo.find() list objects in collection foo db.foo.find( { a : 1 } ) list objects in foo where a == 1it result of the last line evaluated; use to further iterate DBQuery.shellBatchSize = x set default number of items to display on shell exit quit the mongo shell
  • 数据类型

MongoDB 的文书档案与 JavaScript 中的对象周围,因此能够认为类似于 JavaScript 中的 JSON,JSON 是1种轻巧的数据表示方式,仅有 各个数据类型,分别为 null、bool、number、string、array 和 object。

MongoDB在保留 JSON 基本键/值对特色的功底上,增多了其余的1部分数据类型:null

用来表示空值也许不设有的字段:

{ "x" : null}

number 数值

shell 默许使用 陆12位浮点型数值,对于整型值,可采纳 NumberInt 类或 NumberLong 类:

{ "pi" : 3.14, "x" : 3, "ni" : NumberInt, "nl" : NumberLong}

string 字符串

UTF-八 类型的字符串都足以代表为字符串类型的数据:

{ "x" : "this is a string.", "y" : "这是一个NB的字符串"}

date 日期

日子被积累 为自新纪元以来通过的皮秒数,不存款和储蓄时区:

{ "x" : new Date()}

regular expression 正则表达式

在举行查询时,大家得以一贯动用正则表达式作为值,语法与 javascript 的同样:

{ "x" : /foobar/i}

array 数组

多少列表或数据集能够发挥为数组:

{ "a" : ["x", "y" , "z"]}

object id 对象ID

指标ID是3个 12 字节的ID,它是文书档案的唯一标志:

{ "x" : ObjectId()}

object id 以以下方法生成:

|0|1|2|3|4|5|6|7|8|9|10|11|| 时间戳 | 机器|PID| 计数器 |

光阴戳在前,对于索引成效升高有一定的效力;同期它也带了一定的小运消息,一些驱动能够从 ObjectId 获取这个消息;时间戳与机器码还只怕有 PID 组合在共同,提供了秒级其余唯一性,机器码是机械主机名的散列值;PID确认保证了同壹台主机分化进程产生的 ObjectId 的唯1性,接下去的字节最终的计数器,确定保证同等台机器同3个经过在锲而不舍秒内发出的 ObjectId 是不均等的,一分钟最多允许各类进度具备 256二个不等的ObjectId。自动生成 _id

若插入文书档案时,未有提供 _id 键

object 内嵌文书档案

文书档案能够嵌套其它文书档案,被嵌套的文书档案作为父文书档案的值:

{ "o" : { "name" : "child object" }}

binary data 2进制数据

任性字节的字符串,它不直间接在 shell 中选取,假若要将非 utf-八字符保存到数据库中,2进制数据是无与伦比的兑现形式。

javascript 代码

查询和文书档案中能够包含做事情 JavaScript 代码:

{ "script" : function() { /* code goes here */ }}

timestamps 时间戳

分歧于 Date 类型的时光戳值,它是三个 陆拾十一人长度的值,它是:

前面的 32位为 time_t 值,后三十一位是一个在加以的岁月内的自增值

本文由www.w88985.com发布于w88官方网站手机版,转载请注明出处:MongoDB学习笔记二w88官方网站手机版

关键词: www.w88985.c