条件操作符:

  • (>) 大于 – $gt
  • (<) 小于 – $lt
  • (>=) 大于等于 – $gte
  • (<= ) 小于等于 – $lte

类似于SQL语句:

类似于SQL语句:


$type操作符:筛选出某种类型的数据来

$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。

MongoDB 中可以使用的类型如下表所示:

类型 数字 备注
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

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

 

MongoDB 与 RDBMS Where 语句比较

如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:

操作 格式 范例 RDBMS中的类似语句
等于 {<key>:<value>} db.col.find({"by":"AAA"}).pretty() where by = 'AAA'
小于 {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

MongoDB AND 条件

MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,及常规 SQL 的 AND 条件。

语法格式如下:

MongoDB OR 条件

MongoDB OR 条件语句使用了关键字 $or,语法格式如下:

AND 和 OR 联合使用

以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: ‘where likes>50 AND (by = ‘AAA’ OR title = ‘MongoDB 教程’)’

 

  1. 增加数据库:直接use database,如果没有此数据库就直接创建
  2. 查看当前用的是什么数据库:>db
  3. 数据库删除:db.database.drop()
  4. 文档增加:db.database.insert({“数据key”:”数据value”})
  5. 文档删除:
    2.6版本以前
    db.database.remove(
    <query>,
    <justOne>
    )
    2.6版本以后
    db.database.remove(
    <query>,
    {
    justOne: <boolean>,
    writeConcern: <document>
    }
    )
    参数说明:
    query :(可选)删除的文档的条件。
    justOne : (可选)如果设为 true 或 1,则只删除一个文档。
    writeConcern :(可选)抛出异常的级别。
  6. 文档查询:db.database.find()如果想直观的观看数据可在后边加一个 pretty(),db.database.find().pretty()
  7. 文档修改:
    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 :可选,抛出异常的级别。
  1. 选择适合与机器的bit版本,进行下载(需要耐心等待,速度有些慢)下载地址:http://www.mongodb.org/downloads
  2. 下载成功后进行安装尽量选择自定义安装目录
  3. 我将上图的路径放在了 D盘,会出现一个mongodb的目录MongoDB将数据目录存储在 db 目录下。但是这个数据目录不会主动创建,我们在安装完成后需要创建它。请注意,数据目录应该放在根目录下((如: C:\ 或者 D:\ 等 )。在D:根目录下创建一个data的目录然后在data目录里创建db目录(这里需要手动创建)。这时我们D盘下有两个文件mongodb和data
  4. 在cmd(命令行)下进入到D:\mongodb\bin\运行如下代码,来指定日志的输出路径

    运行结果大概

    这段命令执行完(需要保留此窗口,因为现在就已经建立了mongodb的连接),再另开一个cmd命令窗口,来进行设置和其他操作

  5. 将MongoDB服务器作为Windows服务运行:

    在D:\data\下创建一个dbConf\mongodb.log文件
    在新的命令窗口进入到D:\mongodb\bin\下执行如下代码,以下代码自行查看下表进行对号修改此命令

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

    参数 描述
    –bind_ip 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP
    –logpath 定MongoDB日志文件,注意是指定文件不是目录
    –logappend 使用追加的方式写日志
    –dbpath 指定数据库路径
    –port 指定服务端口号,默认端口27017
    –serviceName 指定服务名称
    –serviceDisplayName 指定服务名称,有多个mongodb服务时执行。
    –install 指定作为一个Windows服务安装。
  6. 在D:\mongodb\bin下运行

    进入到mongodb后台管理shell

 

 

 

 

 

  • 使用原理:
    1. 所谓“面向集合”(Collenction-Oriented),意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无线数目的文档。集合的概念类似关系型数据库(RDBMS)里表(Table),不同的是他不需要任何定义模式(schema),Nytro MegaRAID技术中的闪存高速缓存算法,能够快速识别数据库内的大数据集中的热点数据,提供一致性的性能改进。
    2. 模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道他的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里
    3. 存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串型,而值则可以是各种复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized Document Format)。
    4. MongoDB已经在多个站点部署,器主要场景如下:
      1. 网站实时数据处理。他非常适合实时的插入、更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性
      2. 缓存。由于性能很高,他适合作为信息基础设施的缓存层。在系统重启之后,有他搭建的持久层可以避免下层的数据源过载。
    5. 高伸缩性的场景。非常适合有数十或者数百台服务器组成的数据库,他的线路图已经包含对MapReduce引擎的内置支持。
    6.  不适用的场景:
      1. 传统商业智能应用
      2. 复杂的跨文档(表)级联查询。
  • 设计特征:
    1. 面向集合存储,容易存储对象类型数据。
    2. 模式自由,采用无模式结构存储。
    3. 支持完全索引,可以在任何属性上简历索引,包含内部对象。
    4. 支持查询,支持大部分sql中的查询
    5. 强大的聚合工具。如count、group,也支持MapReduce完成复杂的聚合任务
    6. 支持复制和数据恢复。
    7. 使用高效的二进制数据存储,包括大型对象(如视频)。
    8. 自动处理分片,以支持云计算层次的扩展。MongDB支持集群自动切分数据,对数据进行分片可以使集群存储更多的数据,实现更大的负载,也能保证存储的负载均衡。
    9. 支持Perl、PHP、Java、C#、Javascript、Ruby、C和C++语言驱动程序,MongDB提供了当前所有主流开发语言数据库驱动包,开发人员使用任何一种主流开发语言都可以轻松变成,实现访问MongoDB数据库。
    10. 文件存储格式为BSON(JSON的一种扩展)。BSON是二进制格式的JSON简称,它支持文档和数组的嵌套。
    11. 可以通过网络访问。可通过网络远程访问MongoDB数据库。
  • 基本概念
    1. 文档:是MongoDB中数据基础单位
    2. 集合:是一组文档,类似于关系数据库中的表
    3. 数据库:是多个文档组成,多个结合组成的数据库
      1. Admin数据库:权限数据库,如果创建用户时将该用户添加到admin数据库,那么该用户就自动承载了所有数据库的权限
      2. Local数据库:这个数据库永远不会被负责,可以存储本地单台服务器的任意集合。
      3. Config数据库:当MongoDB使用分片模式时,config数据库在内部使用,用于保存分片信息。
    4. 数据模型:

一个MongoDB实例可以包含一组数据库

一个DataBase可以包含一组Collection(集合)

一个集合可以包含一组Document(文档)

一个Document可以包含一组field(字段),每一个字段都是一个key/value pair。

Key:必须为字符串类型

Value:可以是基本类型(string、int、floating、timestamp、binary等)、一个Document、数组类型

  • 适用场景
    1. 网站数据:Mongo非常适合实时的插入、更新与查询,并具备网站实时数据存储所需要的复制及高度伸缩
    2. 缓存
    3. 大尺寸、低价值得数据:
    4. 高伸缩性的场所:
    5. 用于对象及json数据的存储

无意间看到一个大神的博客http://www.cnblogs.com/figure9/

身为靠互联网吃饭的人,看到人家的学习之路真是深表惭愧,总共看完的编程方面的书还不到三本(呵呵),从小就不爱看书,不爱学习(怎么破),有可能是因为真的是没有兴趣,又或者是没有规划好自己的学习目标?

前不久做1个月 的学习规划(比较泛,没有精确到点),这个学习方案,进行到一半的时候因为以前的项目出现bug和新需求,所以断片儿了,接着经常性的短片儿,到最后把规划方案扔到了一边都想不起来了,唉,规划好的东西都坚持不下来!!服了自己了。没有规划好、没有坚持住

兴趣呢?反正做项目的是是不会感觉到累也不会感觉困,一旦真的要学习的时候,看着看着书就开始犯困,现在想来这里缺乏的不是学习的心,而是兴趣向上的动力,没有这些就只能是个码农(没有思想的码农)。

崇拜这位大神,在不断的提升自己,坚持住这份激情真是难得。

希望自己以后能常常看看这篇文章。

摘自http://www.lupaworld.com/article-242544-1.html

算法一:快速排序算法

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比 较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构 上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

算法步骤:

1 从数列中挑出一个元素,称为 “基准”(pivot),

2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

算法二:堆排序算法

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

堆排序的平均时间复杂度为Ο(nlogn) 。

算法步骤:

创建一个堆H[0..n-1]

把堆首(最大值)和堆尾互换

3. 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置

4. 重复步骤2,直到堆的尺寸为1

算法三:归并排序

归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

算法步骤:

1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置

3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

4. 重复步骤3直到某一指针达到序列尾

5. 将另一序列剩下的所有元素直接复制到合并序列尾

 

算法四:二分查找算法

二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜 素过程结束; 如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组 为空,则代 表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn) 。

算法五:BFPRT(线性查找算法)

BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分 析,BFPRT可以保证在最坏情况下仍为线 性时间复杂度。该算法的思想与快速排序思想相似,当然,为使得算法在最坏情况下,依然能达到o(n)的时间复杂 度,五位算法作者做了精妙的处理。

算法步骤:

1. 将n个元素每5个一组,分成n/5(上界)组。

2. 取出每一组的中位数,任意排序方法,比如插入排序。

3. 递归的调用selection算法查找上一步中所有中位数的中位数,设为x,偶数个中位数的情况下设定为选取中间小的一个。

4. 用x来分割数组,设小于等于x的个数为k,大于x的个数即为n-k。

5. 若i==k,返回x;若i<k,在小于x的元素中递归查找第i小的元素;若i>k,在大于x的元素中递归查找第i-k小的元素。

终止条件:n=1时,返回的即是i小元素。

算法六:DFS(深度优先搜索)

深度优先搜索算法(Depth-First-Search),是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分 支。当节点v 的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发 现的节点, 则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。DFS属于盲目搜索。

深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。一般用堆数据结构来辅助实现DFS算法。

深度优先遍历图算法步骤:

1. 访问顶点v;

2. 依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;

3. 若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。

上述描述可能比较抽象,举个实例:

DFS 在访问图中某一起始顶点 v 后,由 v 出发,访问它的任一邻接顶点 w1;再从 w1 出发,访问与 w1邻 接但还没有访问过的顶点 w2;然后再从 w2 出发,进行类似的访问,… 如此进行下去,直至到达所有的邻接顶点都被访问过的顶点 u 为止。

接着,退回一步,退到前一次刚访问过的顶点,看是否还有其它没有被访问的邻接顶点。如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;如果没有,就再退回一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。

算法七:BFS(广度优先搜索)

广度优先搜索算法(Breadth-First-Search),是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点。如果所有节点均被访问,则算法中止。BFS同样属于盲目搜索。一般用队列数据结构来辅助实现BFS算法。

算法步骤:

1. 首先将根节点放入队列中。

2. 从队列中取出第一个节点,并检验它是否为目标。

如果找到目标,则结束搜寻并回传结果。

否则将它所有尚未检验过的直接子节点加入队列中。

3. 若队列为空,表示整张图都检查过了——亦即图中没有欲搜寻的目标。结束搜寻并回传“找不到目标”。

4. 重复步骤2。

算法八:Dijkstra算法

戴克斯特拉算法(Dijkstra’s algorithm)是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出。迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。

该算法的输入包含了一个有权重的有向图 G,以及G中的一个来源顶点 S。我们以 V 表示 G 中所有顶点的集合。每一个图中的边,都是两个顶点 所形成的有序元素对。(u, v) 表示从顶点 u 到 v 有路径相连。我们以 E 表示G中所有边的集合,而边的权重则由权重函 数 w: E → [0, ∞] 定义。因此,w(u, v) 就是从顶点 u 到顶点 v 的非负权重(weight)。边的权重可以想像成两个顶点之 间的距离。任两点间路径的权重,就是该路径上所有边的权重总和。已知有 V 中有顶点 s 及 t,Dijkstra 算法可以找到 s 到 t的最低权 重路径(例如,最短路径)。这个算法也可以在一个图中,找到从一个顶点 s 到任何其他顶点的最短路径。对于不含负权的有向图,Dijkstra算法是目 前已知的最快的单源最短路径算法。

算法步骤:

1. 初始时令 S={V0},T={其余顶点},T中顶点对应的距离值

若存在<v0,vi>,d(V0,Vi)为<v0,vi>弧上的权值

若不存在<v0,vi>,d(V0,Vi)为∞

2. 从T中选取一个其距离值为最小的顶点W且不在S中,加入S

3. 对其余T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值缩短,则修改此距离值

重复上述步骤2、3,直到S中包含所有顶点,即W=Vi为止

算法九:动态规划算法

动态规划(Dynamic programming)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。

动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许 多 子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同 一个 子问题解之时直接查表。 这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。

关于动态规划最经典的问题当属背包问题。

算法步骤:

1. 最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。

2. 子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多 次。 动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题 时,只是 在表格中简单地查看一下结果,从而获得较高的效率。

算法十:朴素贝叶斯分类算法

朴素贝叶斯分类算法是一种基于贝叶斯定理的简单概率分类算法。贝叶斯分类的基础是概率推理,就是在各种条件的存在不确定,仅知其出现概率的情况 下, 如何完成推理和决策任务。概率推理是与确定性推理相对应的。而朴素贝叶斯分类器是基于独立假设的,即假设样本每个特征与其他特征都不相关。

朴素贝叶斯分类器依靠精确的自然概率模型,在有监督学习的样本集中能获取得非常好的分类效果。在许多实际应用中,朴素贝叶斯模型参数估计使用最大似然估计方法,换言之朴素贝叶斯模型能工作并没有用到贝叶斯概率或者任何贝叶斯模型。

换了新编辑器上传图片,图片是上传成功了,但是查看图片库里没有,因为这是走的外部上传方法

第一:修改如下在外部上传脚本中/statics/js/kindeditor/php/upload_json.php  添加如下代码

上传成功后的代码后加入如下代码

第二:需要修改attachment.class.php

复制add方法并改名为add_external_data,此处主要是缺少了siteid,因为外部加载此类获取不到siteid的值,只能通过cookie获取

 

 

项目需求不明确,回头来改的!!!!!!

遇到此问题就是因为前期刚做的时候没有将图片按照站点来分,导致很多图片还是v9默认的路径,那么这些路径如何移动到站点对应的目录下呢?

代码如下:

文件是/phpcms/modules/attachment/attachments.php,在此类中添加一个方法