Sayarara's notebook

blogs/notes/readings


  • Home

  • Archives

  • Search

mongodb

Posted on 2017-11-07 | In notes.database

简介

MongoDB是NoSQL(Not Only SQL)非关系型数据库中的一种。基本数据单元是文档(document),可以看成是JSON的扩展--BSON(Binary Serialized Document Format)。集合(collection)是一组(通常建议同种类型)文档,可以看作是一个拥有动态模式(dynamic schema)的表。由于没有预定义模式(predefined schema),字段的增删/schema的动态变动变得容易,因此最后项目中使用了MongoDB设计存储模块。

工具

Robomongo: https://robomongo.org

数据类型

支持JSON的所有数据类型:null、布尔、数值、字符串、数组和对象

  • null
  • 布尔
  • 数值. 默认浮点数,整型值用NumberInt()或NumberLong()
  • 字符串
  • 数组. 能作为有序对象(如列表、栈或队列),也能作为无序对象(如数据集)来操作.
  • 对象. ObjectID()
  • 日期. new Date()
  • 内嵌文档。被嵌套的文档作为父文档的某个key的值

基本操作

insert(),find()/findOne(),update(),remove()

插入

insert()插入一个;batchInsert([])批量插入。

删除。

remove()删除所有文档当不删集合和集合元信息;drop()删除集合;remove(条件)删除符合条件的文档。

更新。

文档替换。

update(criteria, 新文档)。 其中criteria用于定位目标文档。

更新文档中的一部分,

对文档中的某些字段进行更新。使用原子性的更新修改器(update modifier):

  • “$inc”修改器。增加已有键的值,或者该键不存在则创建一个。用于更新分析数据、因果关系、投票或者其他有变化数值的地方. 只能用于整型、长整型或双精度浮点型的值
    • update(criteria, {“$inc”:{“count”:1}}) 使用”$inc”使count值增加1
  • “$set”修改器。用来指定一个字段的值。如果这个字段不存在,则创建它。即用于更新模式或者增加用户定义的键
    • update(criteria,{“$set”:{k,v}}).添加键/更改值。v可以是数组。
    • update(criteria,{“$unset”:{k,v}}).删除键。
    • update(criteria,{“$set”:{d.k,v}}). 修改内嵌文档。d是文档中的内嵌文档的key。
  • 数组修改器。
    • “$push”修改器。如果数组已经存在,会向已有的数组末尾加入一个元素,要是没有就创建一个新的数组。
    • “$addToSet”修改器。将数组作为集合使用,保证增加元素时数组内的元素不会重复。
    • “$pop”修改器。数组看成队列或者栈从数组中删除元素。{“$pop”:{“key”:1}}从数组末尾删除一个元素,{“$pop”:{“key”:-1}}则从头部删除。
    • “$pull”修改器。按特定条件来删除元素。update({},{“$pull”:criteria})。其中criteria用于定位元素。
    • 基于位置(数组下标)的修改器。比如 {“$set”:{“attributes.0.alive”:false}}
    • 基于定位操作符”$”的修改器。”$”用来定位查询文档已经匹配的数组元素,定位符只更新第一个匹配的元素。. update({“attributes.name”:”year”},{“$set”:{“attributes.$.alive”:false}})
upsert更新。

要是没有找到符合更新条件的文档,就会以这个条件和更新文档为基础创建一个新的文档。如果找到了匹配的文档,则正常更新。 update(条件文档,修改器文档,true),update的第3个参数表示这是个upsert.

save函数。

是一个shell函数,如果文档不存在,自动创建文档;如果文档存在,则更新这个文档。它只有一个参数:文档。如果这个文档含有”_id”键,save会调用upsert。否则,调用insert。

更新多个文档。

默认只对符合匹配条件的第一个文档执行操作。要更新所有匹配的文档,可以将update的第4个参数设置为true。

findAndModify命令。

查询。

find查询。
  • find(). 批量返回集合c中的所有文档
  • find(doc). find的第一个参数是一个文档,向查询文档中添加键/值对时,即指定查询条件;加入多个键/值对,即组合条件查询。
  • find(doc,{“key1”:1,”key2”:0}). find的第二个参数指定需要返回的键。1表示返回key1,0表示剔除查询结果中的key2。
查询条件。
  • 比较操作符:”$lt”(小于)、”$lte”(小于等于)、”$gt”(大于)、”$gte”(大于等于)、”$ne”(不等)。 {“age”:{“$gte”:18,”$lte”:30}} 指定查询条件为”age”字段大于等于18、小于等于30的所有文档。
  • OR查询。
    • “$in”,对单个键做OR查询。{“num”:{“$in”:[1,2,7]}},条件数组中的值可以是不同类型的数据。
    • “$nin”, 返回与数组中所有条件都不匹配的文档.
    • “$or”, {“$or”:包含所有可能条件的数组}
  • “$not”,查找与条件不匹配的文档。与正则表达式联合使用时用来查找与特定模式不匹配的文档。
  • “$and”,“$nor”
特定类型的查询
  • 正则表达式。使用Perl兼容的正则表达式(PCRE)库。
  • 查询数组。 假设有如下文档 {“key”:[“v1”,”v2”,”v3”]}
    • 匹配一个元素。查询条件(实质是一个文档) {“key”:”v2”}
    • 匹配多个元素。“$all”。 查询条件 {“key”,{“$all”:[“v1”,”v2”]}}.返回满足条件(包含值v1和v2)的所有文档。
    • 查询数组特定位置的元素。key.index。 查询条件{“key.2”:”v3”},返回数组第三个元素值为”v3”的所有文档。数组下标是从0开始的。
    • “$size”,用于查询特定长度的数组。
    • “$slice”,返回某个键匹配的数组元素的一个子集. findOne(criteria,{“key”:{“$slice”:10}}) 返回前10;findOne(criteria,{“key”:{“$slice”:-10}}) 返回后10条; findOne(criteria,{“key”:{“$slice”:[23,10]}}) 返回第24~33个元素。
    • $操作符。 find(criteria,{“key.$”:1}) 返回第一个匹配的文档.
    • “$elemMatch”,同时使用查询条件中的各个语句与一个数组元素进行比较。但不会匹配非数组元素。
  • 查询内嵌文档。“$elemMatch”将限定条件进行分组,仅当需要对一个内嵌文档的多个键操作时才会用到。
  • “$where”,用于在查询中执行任意的JavaScript,在速度上要比常规查询慢很多,应避免使用。

参考文献

Mongodb权威指南

数据交换格式xml和json

Posted on 2017-11-06 | In 调研
项目中需求使用文本形式存储数据,以应对schema动态变化和实时反馈局部子数据集变化。

以下是对数据交换格式Xml和JSON的调研结果。

Xml和JSON的简单介绍

  1. Xml指可扩展标记语言(Extensible Markup Language),类似于HTML(区别是HTML用来显示数据而Xml用来结构化、存储和传输数据),需要自定义严格的闭合标签,具有自我描述性。格式统一,跨平台和语言。是标准通用标记语言 (SGML) 的子集,是w3c的推荐标准。
    • 优点:格式统一,符合标准;容易与其他系统进行远程交互,数据共享比较方便。
    • 缺点:XML文件庞大,文件格式复杂,传输占带宽。服务器端和客户端都需要花费大量代码来解析XML。
  2. JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,简洁并且层次结构清晰,结构化标记数据,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。是基于ECMAScript(w3c制定的js规范)的一个子集,是JS的原生格式。
    • 优点:数据格式简单,易于读写,格式都是压缩的,占用带宽小;适合前端用于开发。
    • 缺点:对数据的描述性比XML差。

Xml和JSON的对比

  1. 可读性方面xml好一些,因为有严格闭合的标签。
  2. 扩展性方面两者相当。都是易于扩展的跨平台数据交换格式。
  3. 编写和解析难度方面,两者都有成熟的工具包提供使用。Xml (dom, SAX, dom4j,JDOM等), json(Gson, JackJson, fastjson等)
  4. 数据体积方面,json拥有更小的体积和更快的传输速度,因为xml中包含大量冗余的标记字符。
  5. 数据格式对比:
    • Xml提供了逐步解析的方法(SAX),适合于大规模的解析。而JSON只提供整体解析方案。
    • Xml也提供了整体解析方法(DOM),把一个XML看成一个DOM对象,需要把XML文件整个读入内存。但XML的解析要考虑父节点和子节点,而JSON构建基于key/value,JSON的解析难度要小很多。
  6. 索引技术方面:
    • Json索引技术。Mysql5.7及SQL Server 2016开始支持json数据格式,通过创建虚拟列(用于返回要用于筛选的值)来创建索引。
    • XML索引技术。很复杂。

Xml索引技术

  1. 结构摘要类索引。将 XML 数据按照路径进行约简,要求只保存 XML 数据中不同的路径,将具有相同路径的节点集合作为约简中该路径的末端节点的内容。那么,在 XML 数据上的路径查询处理,也就能够在约简结构中得到相同的结果节点集合。比如Fix索引。
  2. 节点记录类索引。将 XML 数据分解为数据单元的记录集合,同时在记录中保存该单元在 XML 数据中的位置信息.
    • 节点序号方法。设计某种遍历策略(比如标签有向树的先序遍历、后序遍历和基于字符流模型的顺序遍历等),得到节点的序号(遍历得到由元素组成的序列,节点的标签在序列中就具有唯一的次序),将序列与某指标集(比如自然数,局部编码和素数等)建立一一映射的关系。比如Xpath索引。
    • 节点路径方法。将所有的路径表达式看成字符串并且将它们按照字典排序,然后将其作为索引项插入到相应的树型索引结构中。树的每个叶子节点都包含一个表示一个路径表达式的字符串,以及一个与该路径表达式结果相对应的id列表。索引记录的基本模式为(数据单元标识,路径信息),核心技术是字符串的模式匹配,基于Trie,Patricia trie, suffix tree等。 比如Fabric索引,VIST索引。

建议

建议直接每个类一个文件,文件名是属性的组合,文件里存记录id。检索用正则检索文件名,动态修改某个类的schema时只要重命名对应的文件名,这样处理局部数据也比较容易,不用每次schema修改都重写全部类文档。
如果一定要在Xml和JSON里二选一,推荐JSON,因为比较适合前端用,k/v的存储方式不用考虑属性之间的次序关系,而且mysql支持存储和索引json格式的数据。
1…45

Sayarara

42 posts
9 categories
36 tags
© 2019 Sayarara
Powered by Hexo
|
Theme — NexT.Muse v5.1.4