灰机版本 > 2.2.0

MongoDB是一款著名的nosql数据库。灰机通过引入MongoDB的支持,实现了结构化数据的存储和查找,使得具有编程能力的站长可以更加细腻便捷地构筑维基。 MongoDB的数据非常适合与Mustache模板搭配使用。

功能概述

  • 目的与使用Semantic MediaWiki类似,用以在维基上存储数据并在文章页面有针对性的查询和聚合。
  • 这是一项灰机wiki单独开发的功能,仅在本维基平台上提供技术支持,其他使用MediaWiki的托管平台不保证此类功能一定存在并能够按照本文档所述的方法进行操作。

对比

数据解决方案 藉由Extension 数据库形式 存储方式 查询
SMW Semantic MediaWiki MySQL / SPARQL Wikitext(解析器函数) 解析器函数lua模块(module)
灰机Mongo HuijiMidware MongoDB data页面 默认仅支持lua模块(module)
SMongo 支持使用模板(template)化的SMW语法查询

存储数据

在Data(3500)命名空间下,通过为标题添加后缀,内容类型将会从纯文本变为指定类型。

例如,以.json结尾的条目,会自动将内容类型变为Json数据。以.tab结尾的条目,将自动转换为表格型。tabx是对tab进行的扩展,突破了表格只能存储二维数据的限制。具体方法请参阅这里

命名 普通Data页面 Data:xxx.json Data:xxx.tab Data:XXX.tabx
定制化编辑器 ✔️ ✔️ ✔️
Schema检查 ✔️ ✔️ ✔️
映射至MongoDB ✔️ ✔️ ✔️
页面直接使用{{}}嵌套 ✔️ ✔️
排序 ✔️ ✔️
自定义复杂结构 ✔️ ✔️

使用tab和tabx请注意

  • tab/tabx的数据结构:注意,必须严格遵循第一行是表头,每一行为一条数据的结构,反之(每一列为一条数据)则无法正常查询。
  • tab和tabx格式提供Excel的上传和导出功能,但是请注意Excel中的数据类型和tab/tabx可能并不相符,并且Excel中没有要求每一列的数据格式统一,而tab和tabx是严格要求每一列数据的类型是一致的(string/boolean/number)。tab/tabx将检测第二行的数据,以自动建立字段类型的schema,将True/False转换为boolean,数字转换为number型。
    • 如果Excel中的第二行数据有空白,将会影响类型的判断。对于这种情况,建议在Excel表的第二行录入一组假数据,便于tab/tabx进行类型判断。
另行参阅:帮助:模块/MongoDB函数帮助:灰机Wiki数据更新器

删改数据

tab页面还支持直接上传Excel或CSV

通过具有MongoDB支持的Data页面录入数据后,维基将自动管理该数据的生命周期,用户只需像修改维基一样对数据进行编辑,后台MongoDB的内容也会自动同步更新。

查询数据

通过具有MongoDB支持的Data页面录入数据后,即可通过灰机提供的API进行查询和聚合。


数据形态

MongoDB中的数据都是以Json形式存在的。

命名 结构&关系
Data:xxx.json 与JSON的读取规则完全一致,每一个.json页面是一个document,数据id是页面名字,例如"Data:xxxxx.json"
Data:xxx.tab 第一行表头作为key,以下每一行都是一个document,数据id是页面名字+行数,后面的每一个单元格为值的对象。
Data:XXX.tabx 与tab类似,但是支持多层级结构,在tab的基础上,扩充了表头的语义

Lua查询

主要条目:模块

灰机提供了以下四个函数供用户在lua模块中操作MongoDB:

  • mw.huiji.db.find( filter, options ) 查看更多
  • mw.huiji.db.aggregate( pipeline, options ) 查看更多
  • mw.huiji.db.findOne( filter, options )
  • mw.huiji.db.count( filter, options )

另行参考官方文档,(英文):FindFindOneCountAggregate


使用SMongo查询

主要条目:SMongo

利用灰机提供的零件,使用封装成普通模板的SMongo来进行数据查询,语法风格与SMW的{{#ask:}}函数完全一致


Javascript查询

Javascript查询可通过WebAPI进行,目前API还处于实验阶段,请参照www.huijiwiki.com/api/rest_v1/的文档进行使用。(各维基须将www替换为自己维基的站点前缀,如warcraft)

范例

最终幻想XIV维基是使用本文所列的MongoDB方法搭建的。

avatar
avatar
Reasno
1

@SerGawen 我删掉了响应速度的比较 因为响应速度主要取决于应用场景  对于json数据肯定是mongo快 对于graph数据,应该smw有优势。

3年