高手求助,mongodb中游标卡尺怎样在再次从头开始

高手求助!!! mongodb中游标怎样在再次从头开始? - 知乎5被浏览424分享邀请回答api.mongodb.org/python/current/api/pymongo/cursor.html0添加评论分享收藏感谢收起MongoDB(8)
原文地址:
本文采用Google翻译,有些地方数据类型被翻译成了中文,建议中英文对照一起看。
MongoDB的启动选项可以在命令行或配置文件中设置。
两者之间的语法略有不同。 以下是三种类型的选项:
--dbpath / path / to / db
dbpath = / path / to / db
auth = true
vvv = true
运行mongod --help获取完整的选项列表。
这里有一些最有用:
--config / path / to / config
指定其中设置其他选项的配置文件。
--dbpath / path / to / data
数据目录的路径。
--logpath /path/to/file.log
日志在哪里存储。
这是一个到精确文件的路径,而不是目录。
--logappend
在重新启动时,追加到(不截断)现有日志文件。在使用--logpath选项时始终使用此选项。
将mongod作为守护进程。
在单个服务器上启用身份验证。
--keyFile /path/to/key.txt
在副本集和分片上启用身份验证。
获取共享密钥的路径
--nohttpinterface
关闭HTTP界面。
--bind_ip地址
仅允许来自指定网络接口的连接。
如果你在六个月前开始使用一系列选项,你如何看到你使用哪些选项?
shell有帮助:
& db.serverCmdLineOpts() { “argv” : [ “./mongod”, “--port”, “30000” ], “parsed” : { }, “ok” : 1 }
解析的字段是从配置文件读取的参数列表
有一些功能,如果你忘记一个命令,给你一点帮助:
& // basic 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 ...
请注意,对于数据库,集合,副本集,分片,管理等,有单独的帮助功能。
虽然没有明确列出,但也有光标的帮助:
& // list common cursor functions & db.foo.find().help()
您可以使用这些功能和帮助作为内置的备忘单。
查看函数定义
如果你不明白函数是做什么的,你可以运行它没有括号在shell中看到它的源代码:
& // run the function & db.serverCmdLineOpts() { “argv” : [ “./mongod” ], “parsed” : { }, “ok” : 1 } & // see its source & db.serverCmdLineOpts
这可以有助于查看它期望的参数或可以抛出的错误,以及如何从另一种语言运行它。
shell有限的多行支持,所以可能很难编程。shell帮助器编辑使这更容易,打开一个文本编辑器,并允许您从那里编辑变量。例如:
&xmp& & x = function() { /* some function we're going to fill in */ } & edit x &opens emacs with the contents of x& &/xmp&
在编辑器中修改变量,然后保存并退出。
变量将在shell中设置。
必须将EDITOR环境变量或MongoDB shell变量EDITOR设置为使用edit。您可以在MongoDB shell中设置它,如下所示:
&xmp$ & EDITOR=”/user/bin/emacs” &/xmp&
编辑不能从JavaScript脚本,只在交互式shell中。
.mongorc.js
如果.mongorc.js文件存在于主目录中,它将在shell启动时自动运行。
使用它来初始化您经常使用的任何帮助函数,并删除不想意外使用的函数。
例如,如果您希望默认情况下没有dropDatabase()可用,可以将以下行添加到.mongorc.js文件中:
&xmp& DB.prototype.dropDatabase = function() { print(“No dropping DBs!”); } db.dropDatabase = DB.prototype.dropD &/xmp&
上面的示例将dropDatabase()帮助器更改为仅打印消息,而不是删除数据库。
请注意,此技术不应用于安全性,因为确定的用户仍然可以删除没有帮助程序的数据库。
但是,删除危险的管理命令可以帮助防止手指插入。
您可能想要从.mongorc.js中删除助手的几个建议是:
DB.prototype.shutdownServer DBCollection.prototype.drop DBCollection.prototype.ensureIndex DBCollection.prototype.reIndex DBCollection.prototype.dropIndexes
可以通过将prompt变量设置为返回字符串的函数来定制shell提示:
&xmp& prompt = function() { try { db.getLastError(); } catch (e) { print(e); } return (new Date())+”$ “; } &/xmp&
如果你设置提示,它将在每次绘制提示时被执行(因此,上面的例子会给你上次操作完成的时间)。
尝试在您的提示中包括db.getLastError()函数调用。
这包括在默认提示中,并负责服务器重新连接和从写入返回错误。
此外,总是放置任何可以在try / catch块中抛出异常的代码。
这是恼人的让你的提示变成一个例外!
诊断发生了什么
查看和杀戮操作
您可以使用currentOp函数查看当前操作:
&xmp& & db.currentOp() { “inprog” : [ { “opid” : 123, “active” : false, “locktype” : “write”, “waitingForLock” : false, “secs_running” : 200, “op” : “query”, “ns” : “foo.bar”, “query” : { } ... }, ... ] } &/xmp&
使用上面的opid字段,可以终止操作:
&xmp& & db.killOp(123) &/xmp&
并非所有操作都可以被杀死或立即被杀死。
通常,等待锁的操作在获取锁之前不能被终止。
使用explain()查看MongoDB用于查询的索引。
&xmp& & db.foo.find(criteria).explain() { “cursor” : “BasicCursor”, “isMultiKey” : false, “n” : 2, “nscannedObjects” : 2, “nscanned” : 2, “nscannedObjectsAllPlans” : 2, “nscannedAllPlans” : 2, “scanAndOrder” : false, “indexOnly” : false, “nYields” : 0, “nChunkSkips” : 0, “millis” : 0, “indexBounds” : { }, “server” : “ubuntu:27017” } &/xmp&
在explain()的输出中有几个重要字段:
n:返回的结果数。 nscanned:读取的索引条目的数量。 nscannedObjects:索引引用的文档数。 indexOnly:如果查询从来没有触摸集合本身。 nYields:此查询已释放读取锁并等待其他操作的次数。 indexBounds:使用索引时,这将显示索引扫描范围。
BasicCursor表示未使用索引。
BtreeCursor表示使用正常索引。 分片使用并行游标,地理空间索引使用自己的特殊游标。
使用hint()强制将特定索引用于查询:
&xmp& & db.foo.find().hint({x:1}) &/xmp&
您可以打开系统概要分析以查看数据库上当前正在进行的操作。
对性能分析有性能损失,但它可以帮助隔离慢查询。
&xmp& & db.setProfilingLevel(2) // profile all operations & db.setProfilingLevel(1) // profile operations that take longer than 100ms & db.setProfilingLevel(1, 500) // profile operations that take longer than 500ms & db.setProfilingLevel(0) // turn off profiling & db.getProfilingLevel(1) // see current profiling setting &/xmp&
概要文件条目存储在启用概要分析的数据库中的上限集合(称为system.profile)中。可以为每个数据库打开和关闭分析。
要找到复制滞后,请连接到辅助节点并运行此函数:
&xmp& & db.printReplicationStatus() configured oplog size: 2000MB log length start to end: 23091secs (6.4hrs) oplog first event time: Fri Aug 10 :03 GMT+0200 (CEST) oplog last event time: Mon Aug 20 :51 GMT+0200 (CEST) now: Mon Aug 20 :51 GMT+0200 (CEST) &/xmp&
要查看成员对整个集合的视图,请连接到该集合并运行:
&xmp& & rs.status() &/xmp&
此命令将显示它认为其他成员的状态和状态。
在辅助节点上运行rs.status()将在(差的命名)syncingTo字段中显示辅助节点正在同步的人员。
要查看集群的元数据(分片,数据库,块等),请运行以下函数:
&xmp& & db.printShardingStatus() & db.printShardingStatus(true) // show all chunks Mon Aug 20 :51 GMT+0200 (CEST) &/xmp&
您还可以使用“use config”连接到mongos并查看有关您的分片,数据库,集合或块的数据,然后查询相关集合。
&xmp& & use config switched to db config & show collections chunks databases lockpings locks mongos settings shards system.indexes version &/xmp&
始终连接到mongos以获取分片信息。
切勿直接连接到配置服务器。 不要直接写入配置服务器。
始终使用分片命令和助手。
维护后,有时mongos进程没有实际执行维护将不会有更新版本的配置。
退出这些服务器或运行flushRouterConfig命令通常是快速解决这个问题。
&xmp& & use admin & db.runCommand({flushRouterConfig:1}) &/xmp&
通常这个问题将表现为setShardVersion失败的错误。
不要担心日志中的setShardVersion错误,但它们不应该涓流到你的应用程序(你不应该得到驱动程序的错误,除非它连接到的mongos不能到达任何配置服务器)。
Mongo监控服务(MMS)
MMS是一种免费,容易设置的方式来监视MongoDB。
要使用它,请在创建一个帐户
,请参阅/help。
数据库名称不能包含“。”,“$”或“\ 0”(空字符)。
名称只能包含可在文件系统上用作文件名的字符。 Admin,config和local是保留的数据库名称(您可以在其中存储自己的数据,但不要删除它们)。
集合名称不能包含“$”或“\ 0”。
以“system。”为前缀的名称由MongoDB保留,不能删除(即使您创建了集合)。 点通常用于集合名称中的组织,但它们没有语义重要性。名为“che.se”的集合与名为“che”的集合与名为“cheese”的集合没有更多关系。
字段名称不能包含“。”或“\ 0”。
字段只有当它们是数据库引用时才包含“$”。
在后台构建索引,而其他连接可以读写。
此键的每个值必须不同。
不存在的值不编制索引。
非常方便用于索引一些文档可能没有的唯一字段。
expireAfterSeconds
需要几秒钟,使它成为“生存时间”集合。
在创建唯一索引时,删除重复的值,而不是错误输出。请注意,这将删除具有重复值的文档!
当创建聚簇辅助索引时,文档被复制到索引中,使得对该索引的任何查询都是范围查询,因此快。(仅TokuMX分发)
查询格式
查询通常采用以下形式:
&xmp& {key : {$op : value}} &/xmp&
&xmp& {age : {$gte : 18}} &/xmp&
这个规则有三个例外:$和,$或,和$ nor,都是顶层:
&xmp& {$or : [{age: {$gte : 18}}, {age : {$lt : 18}, parentalConsent:true}}]} &/xmp&
更新格式
更新始终采用以下形式:
&xmp& {key : {$mod : value}} &/xmp&
&xmp& {age : {$inc : 1}} &/xmp&
查询运算符
X :不匹配
$ gt,$ gte,$ lt,$ lte,$ ne
{numSold:{$ lt:3}}
?{numSold:1}
X {numSold:“hello”}
$ in,$ nin
{age:{$ in:[10,14,21]}}
?{age:21}
?{age:[9,10,11]}
X {age:9}
{hand:{$ all:[“10”,“J”,“Q”,“K”,“A”]}}
?{hand:[“7”,“8”,“9”,“10”,“J”,“Q”,“K”,“A”]}
X {hand:[“J”,“Q”,“K”]}
{name:{$ not:/ jon / i}}
?{name:“Jon”}
X {name:“John”}
{age:{$ mod:[10,0]}}
?{age:50}
X {age:42}
{phone:{$ exist:true}}
?{phone:“555-555-5555”}
X {phones:[“555-555-5555”,“1-800-555-5555”]}
{age:{$ type:2}}
?{age:“42”}
X {age:42}
{“top-three”:{$ size:3}}
?{“top-three”:[“gold”,“silver”,“bronze”]}
X {“top-three”:[“blue ribbon”]}
{role:/admin.*/i} {role:{$ regex:'admin。*',$ options:'i'}}
?{“top-three”:[“gold”,“silver”,“bronze”]}X {“top-three”:[“blue ribbon”]}
更新修饰符
{x:“foo”}
{$ set:{x:[1,2,3]}}
{x:[1,2,3]}
{x:“foo”}
{$ unset:{x:true}}
{countdown:5}
{$ inc:{countdown:-1}}
{countdown:4}
$ push,$ pushAll
{votes:[ - 1,-1,1]}
{$ push:{vote:-1}}
{votes:[ - 1,-1,1,-1}}
$ pull,$ pullAll
{blacklist:[“ip1”,“ip2”,“ip3”]}
{$ pull:{blacklist:“ip2”}}
{blacklist:“ip1”,“ip3”}
{queue:[“1pm”,“3pm”,“8pm”]}
{$ pop:{queue:-1}}
{queue:[“3pm”,“8pm”]}
$ addToSet,$ each
{ints:[0,1,3,4]}
{$ addToSet:{ints:{$ each:[1,2,3]}}}
{ints:[0,1,2,3,4]
{nmae:“sam”}
{$ rename:{nmae:“name”}}
{name:“sam”}
{permission:6}
{$ bit:{permissions:{or:1}}}
{permission:7}
聚合管道操作员
聚合框架可用于执行从简单查询到复杂聚合的所有操作。
要使用聚合框架,请将aggregate()函数作为聚合阶段的管道:
&xmp& & db.collection.aggregate({$match:{x:1}}, ... {$limit:10}, ... {$group:{_id : “$age”}}) &/xmp&
可用阶段列表:
{$ project:projection}
包括,排除,重命名和绿色字段。
{$ match:match}
查询,接受与传递给find()的参数相同的参数。
{$ limit:num}
将结果限制为num。
{$ skip:skip}
跳过num结果。
{$ sort:sort}
按给定字段对结果进行排序。
{$ group:group}
组结果使用给出的表达式(见下表)。
{$ unwind:field}
将嵌入式数组分解成自己的顶级文档。
要引用字段,请使用语法$ fieldName。
例如,此投影将返回现有的“时间”字段,其中具有新名称“自时代以来的时间”:
&xmp& {$project: {“time since epoch”: “$time”}} &/xmp&
$ project和$ group都可以获取表达式,这可以使用这个$ fieldName语法如下所示
表达式操作示例
$ add:[“$ age”,1]
向年龄字段添加1。
$ divide:[“$ sum”,“$ count”]
将sum字段除以count。
$ mod:[“$ sum”,“$ count”]
除以count的余数。
$ multiply:[“$ mph”,24,365]
乘以24 * 365的mph。
$ subtract:[“$ price”,“$ discount”]
从价格中减去折扣。
$ strcasecmp:[“ZZ”,“$ name”]
1(如果名称小于ZZ),0(如果名称为ZZ),-1(如果名称大于ZZ)。
$ substr:[“$ phone”,0,3]
获取手机的区号(前三个字符)。
$ toLower:“$ str”
将str转换为全部小写。
$ toUpper:“$ str”
将str转换为全大写。
$ ifNull:[“$ mightExist”,$ add:[“$ doesExist”,1]]
如果mightExist不为null,则返回mightExist。否则返回第二个表达式的结果。
$ cond:[exp1,exp2,exp3]
如果exp1求值为true,则返回exp2,否则返回expr3。
创建备份的最佳方法是在数据库文件处于一致状态(即,不在从/到读取中间)时创建数据库文件的副本。
1.使用fsync + lock命令。
这将所有正在进行的写入刷新到磁盘,并阻止新的。
&xmp& {$project: {“time since epoch”: “$time”}} &/xmp&
将数据文件复制到新位置。 使用unlock命令解锁数据库。
&xmp& & db.fsyncUnlock() &/xmp&
要从此备份还原,请将文件复制到正确的服务器的dbpath并启动mongod。
如果您有一个具有文件系统快照的文件系统,并且您的日志位于相同的卷上,并且没有使用RAID进行任何操作,您可以在不锁定的情况下拍摄快照。在这种情况下,当您恢复时,日志将重放操作,以使数据文件一致。
Mongodump仅用于特殊情况下的备份。
如果你决定使用它,不要fsync +锁先。
副本集维护
保持会员当选
要永久停止成员选举,请将其优先级更改为0:
&xmp& & var config = rs.config() & config.members[2].priority = 0 & rs.reconfig(config) &/xmp&
要防止临时选择辅助节点,请连接到辅助节点并发出freeze命令:
&xmp& & rs.freeze(10*60) // # of seconds to not become primary &/xmp&
如果您不想永久更改优先级,但需要在主服务器上进行维护,这可以很方便。
如果成员当前是主要的,并且您不希望成为,请使用stepDown:
&xmp& & rs.stepDown(10*60) // # of seconds to not try to become primary again &/xmp&
作为独立服务器启动成员
对于维护,通常期望启动辅助并且能够对其进行写入(例如,用于构建索引)。
为了实现这一点,你可以作为一个独立的mongod临时启动一个辅助。
如果辅助节点最初使用以下参数启动:
&xmp& $ mongod --dbpath /data/db --replSet setName --port 30000 &/xmp&
将其彻底关闭并重新启动它:
&xmp& $ mongod --dbpath /data/db --port 30001 &/xmp&
请注意,dbpath不会更改,但端口会更改,并且replSet选项将被删除(所有其他选项可以保持不变)。这个mongod将作为一个独立的服务器。副本集的其余部分将在端口30000(而不是30001)上查找成员,因此它将仅显示为“下”到集合的其余部分。
完成维护后,使用原始参数重新启动服务器。
检查当前用户权限
&xmp& & db.runCommand( ... { ... usersInfo:”manager”, ... showPrivileges:true ... } ... ) &/xmp&
创建superAdmin
&xmp& & use sensors switched to db sensors & db.createUser( ... { ... user: “sensorsUserAdmin”, ... pwd: “password”, ... roles: ... [ ... { ... role: “userAdmin”, ... db: “sensors” ... } ... ] ... } ... ) &/xmp&
查看用户角色
&xmp& & use sensors switched to db sensors & db.getUser(“sensorsUserAdmin”) { “_id” : “sensors.sensorsUserAdmin”, “user” : “sensorsUserAdmin”, “db” : “sensors”, “roles” : [ { “role” : “userAdmin”, “db” : “sensors” } ] } &/xmp&
显示角色权限
&xmp& & db.getRole( “userAdmin”, { showPrivileges: true } ) &/xmp&
&xmp& & db.grantRolesToUser( ... “sensorsUserAdmin”, ... [ ... { role: “read”, db: “admin” } ... ] ... ) &/xmp&
&xmp& & db.revokeRolesFromUser( ... “sensorsUserAdmin”, ... [ ... { role: “userAdmin”, db: “sensors” } ... ] ... ) &/xmp&
MongoDB限制
最大文档大小为16 MB。 命名空间必须小于123个字节。 每个命名空间文件必须不大于2047兆字节。 索引条目的总大小必须小于1024字节。 集合最多可以有64个索引。 索引名称(包含命名空间)不能超过125个字符。 副本集最多可以有12个成员。 分片键最多可以有512个字节。 分片键始终是不可变的。 MongoDB非索引字段排序将返回结果,只有这个操作不使用超过32兆字节的内存。 聚合流水线级限制为100兆字节的RAM。
超过限制时,将抛出错误。 “allowDiskUse”选项允许聚合流水线阶段使用临时文件进行处理。批量操作仅限于1000次操作。 数据库名称区分大小写,并且最多可包含64个字符。 集合名称不能包含:$,null或以“system。”开头。
字段名不能包含:$,null或。
在下载MongoDB文档可从请参阅的路线图和文件错误和请求功能在邮寄名单上提出问题:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1279385次
积分:15542
积分:15542
排名:第714名
原创:373篇
转载:272篇
译文:78篇
评论:173条
文章:11篇
阅读:6184
阅读:3966
文章:20篇
阅读:35001
(10)(12)(23)(10)(27)(13)(38)(57)(26)(26)(9)(5)(14)(33)(24)(29)(32)(15)(2)(2)(8)(1)(4)(8)(7)(5)(3)(26)(13)(21)(8)(11)(10)(5)(2)(5)(9)(7)(13)(11)(8)(4)(4)(3)(3)(6)(46)(10)(7)(4)(6)(5)(4)(1)(2)(4)(9)(1)(2)(6)(4)Mongodb(1)
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
对于Mongodb中的聚合应该使用aggregate()方法
语法:db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
先建一组数据用于今天的测试。
统计年龄段中各有多少个
db.TestAggregate.aggregate([{$group:{_id:"$age",num_tutorial:{$sum:1}}}])
统计每个地区中最大的年龄
db.TestAggregate.aggregate([{group:{_id:"address",num_tutorial:{max:"age”}
剩下的都类似大家可以看看下表
二、管道##:
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
这里我们介绍一下聚合框架中常用的几个操作:
$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。
$limit:用来限制MongoDB聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group:将集合中的文档分组,可用于统计结果。
$sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。
db.TestAggregate.aggregate({$project:{name:1,age:1}})
–如果不想出现_ID就用下面的语句执行:
db.TestAggregate.aggregate({$project:{name:1,age:1,_id:0}})
skip 和 limit :
主要用于分页:
之前说过mongodb客户端也是C++写的,所以也支持c++的一些操作。先看下游标的效果
首先var lst 定义了查询出所有集合中的文档,find()。定义完并不会马上执行。
在foreach中循环输出的时候就可以一次性加载过来,然后让游标逐行读取,当我们枚举完了之后,游标销毁。
最后我再去foreach输出时发现没有数据了。
要体现索引的性能,必须要有多的数据。我现在先在我的集合中插入20万条文档,看图
MongoDB中带了分析工具explain(),现在来看下没有加索引查找记录Name:“Michael10000”所花费的时间
millis:描述的是查找所花费的时间。52毫秒
nscanned:200000表示扫面了200000万次文档。
cursor:BasicCursor表示使用全表顺序扫描
其他的根据字面意思很容易明白。
建立索引:
看到没有,扫描耗费时间0,快的飞起。
查看索引和删除索引
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1889次
排名:千里之外
(1)(1)(1)(4)(2)}

我要回帖

更多关于 游标 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信