SMongo logo 2.png

SMongo,全称是“Semantic-Style Mongo Query”,又名“傻芒果”,顾名思义(用傻瓜式的SMW语句查询JSON格式的MongoDB数据),他可以让你像使用Semantic MediaWiki{{#ask:}}函数一样查询灰机的MongoDB数据

更新历史

查看完整的Changelog

关于

  • SMongo并不是一个真正意义上的框架或者MW插件,而是一个完全通过Lua模块撰写“轮子”,设计的初衷是为了向已经习惯了SMW查询又一时间难以学会Lua的游戏wiki编辑者们。是一种过渡工具,简化书写Lua查询MongoDB的难度。
  • 如果您对自己的能力充满信心,还是建议您尽快掌握真正的Lua语法来查询灰机的MongoDB数据。
  • 如上所述,由于SMongo是由Lua构建,因此某些地方受到限制,无法100%的复原SMW的语法,但很多地方却比SMW更加出色。

优点

  • 小巧灵活:只需要搬运一个模板和模块(约200行代码)即可以使用,语法完全继承了SMW的ask函数,对于熟悉SMW的人来说,可以快速上手。
  • 性能飙升:由于使用Lua查询MongoDB,性能有着质的飞跃,查询大批量数据几乎没有压力。
  • 限制较少:以query条件为例,由于性能问题,SMW限制了同时并列条件的最大数量(4个),在SMongo里,可以一口气写上40个条件也没问题。由于使用tabx存储、更新数据,也省去了#set之苦。
  • 便于修改:核心是用Lua模块编写,有能力的开发者也可以自行修改和扩展,以带来更多的特性。

已知缺陷

  • 结果排序:SMongo的操作基于MediaWiki模块机制下frame.object对于模板函数frame.args的调取,由于性能问题,MW限制了frame.args的类型是metatable而不是真正的table,因此我们无法对metatable进行排序操作(ipairs),因此使用SMongo返回的查询结果可能与输入参数的顺序不一致
    • 由此带来的问题:在format=template时,如果没有开启named args选项,模板内的参数序号也与查询时输入参数的顺序不一致
    • 解决方法:尽量使用named args=yes,使用命名参即可绕过这个问题。
  • 兼容性:由于MediaWiki上述metatable的限制,metatable中的所有element都是string类型,而灰机目前支持的JSON、tab、tabx三种格式的MongoDB入库方法,都是基于JSON格式的数据标准,因此默认的查询无法保证能够100%匹配数据库中正确的非string数据类型(number、boolean等)。故而目前的SMongo默认情况下,只推荐对tabtabx格式的单张数据表进行查询操作。
    • 原因:只有tabtabx文件表头的schema部分记录了对应key的数据类型,因此SMongo会通过查询这个schema来对查询条件进行正确的类型转换,.JSON文件无法做到这一点,对于非string类型的数据,Lua会一律按照string类型处理,从而导致非string类型无法正确查询。
    • 例外:如果你站所有结构化数据都是用string存的,那就完全没有上述问题;
    • 解决方法如果查询和使用场景相对固定,您完全可以自行在lua中插入或指定一个包含本站所有待查字段类型的schema(类似SMW在property页面进行属性注册),从而解锁SMongo的全部潜能,实现对.JSON格式数据的准确查询。详见指定schema


tab/tabx模式(推荐)

准备数据表

参见:h:帮助:MongoDB支持

您需要在data:xxxxx.tabdata:xxxxx.tabx的页面上传一个数据表,注意,您可以在excel中编辑数据,但是需要注意以下事项:

  • 表头(第一行)必须是英文,不能以空格或下划线开头;
  • 数据中不能出现制表符和换行符(excel单元格内的硬换行);
  • 单元格内的字符长度不能超过400;

否则页面parser在保存时会抛出异常,并注明数据地址,第一个数字表示行,第二个数字是列(序号从0开始索引)

本文档中使用的数据表为:Data:Testdata.tabx

指定数据表

tab/tabx格式的数据在使用Smongo时必须声明所查询的数据表,格式如下: |table = xxxxxxx.tabx

该功能用来读取此数据表的schema,以正确匹配查询数据的类型(否则默认查询都是string)。

例子

{{ask
|table = Testdata.tabx
...
}}

JSON模式(进阶)

在查询JSON模式的数据时,无需书写|table = xxxx.tab/tabx,否则无法开启JSON模式。但一样可以查询到.tab/.tabx里的数据,(如果有的话)

指定schema

通过在Module:Query/data页面指定一个schema,方法如下:

  • 在本站的Module:Query/data创建一个名为schema的table
  • 将你站所有待查字段的type进行声明,类似在SMW使用过程中,通过在property页面指定字段的has type属性。

下面是一个schema的例子:

实例:hearthstone:Module:Query/data
local p = {}

p.schema = {
	['artist'] ='string',
	['attack'] = 'number',
	['collectible'] ='boolean',
	['cost'] = 'number',
	['dbfId'] = 'number',
	['flavor_zhTW'] = 'string',
	['flavor_jaJP'] = 'string',
	['flavor_enUS'] = 'string',
	['health'] = 'number',
	['id'] = 'string',
}
return p

搬运模板

所有SMongo的模板集成在Template:AskModule:Query

重命名

为了避免覆盖可能存在的同名模板,零件中的主模板叫做SMongo/ask,您可以根据本站情况将其移动到template:Ask,以使用{{ask}}

调用

默认引用{{SMongo/Ask}}模板,您也可以自己重定向到{{ask}},然后就像使用普通的模板一样,为ask模板传参数即可,例如:

{{ask
  |table = Testdata.tabx
  |query = Toy Category::funko,Funko Series::1,Is Released::true,Year::2012
  |?Has Name = 名字
  |?Funko Franchise = 系列
}}

查询

与SMW的{{#ask:}}函数基本一致

参数 说明 备注
table 必须指定一个tabx的数据表,否则有可能无法获取正确的schema tab/tabx模式下必须,JSON模式下不能书写
query ask的查询条件,由于parser的限制,移除了方括号的写法
采用 key1::value1;key2::value2;..的形式
query = Toy Category::funko; Funko Seriers::1; Is Released::true; Year::2012
limit 返回的数据上限,注意,多余部分会隐去,不会像SMW那样出现“查看更多” 默认为200
sort 排序的关键词,不用加“?”,但是注意大小写,详见#排序 默认为_id
order 排序方法,详见#排序 默认为1
class 为默认返回表格结果添加的class,可以用空格隔开多个class,不用引号 class = table table-stripped
mainlabel 默认返回表格的 第一格中所显示的文字 默认为空
format 目前仅支持tabletemplatecount 默认为table
intro 默认表格前的内容
outro 默认表格后的内容
default 查询结果为空时返回的内容
headers headers = hide隐藏第一行
offset 跳过的结果 默认是0
debug=1 开启debug模式
  • linksearchlabel两个鸡肋的功能我删掉了,实际使用SMW的过程中,大家都在千方百计的隐藏掉他们


书写条件

|query = key1::value1;key2::value2;...

为了避免被MediaWiki的parser解析为内链,这里没有使用SMW的条件书写方法,而是用字典的形式。

例子

{{ask
...
|query = Toy Category::funko;Funko Series::1;Is Released::true;Year::2012
...
}}
  • 如果存储的value是一个序列(JSON中的list)譬如list = [ value1, value2, value3 ],那么key1::value1依然可以查询到结果(类似SMW查询被|sep的数据)
  • 单一查询条件支持多个value并列,用,进行分割,彼此之间是“or”的关系,例如|query = key1::value1,value2;,可以同时查找key1的值为(或包含)value1或value2的数据
  • SMongo支持在条件中使用!+<>,用法与SMW一致。

查询字段

|?param = xxx

?param 作为查找的字段,xxx会成为表头显示的文字(不可省略)

  • 注意,查的key都得是指定的tabx里有的,没有的当然没法查了,注意这里查的不是真正的SMW数据,所以也就不存在什么[[category:]],[[concept:]]
  • 等号“=”不能省,值不能为空,否则mw.frame不会将其识别为参数

例子

{{ask
|table = Testdata.tabx
|query = Toy Category::funko;Funko Series::1;Is Released::true;Year::2012
|?Has Name = Has Name 
|?Funko Franchise = 系列
}}

结果

Has Name系列
Data:Testdata.tabx#1提利昂·兰尼斯特Game of Thrones
Data:Testdata.tabx#10异鬼Game of Thrones
Data:Testdata.tabx#2提利昂·兰尼斯特Game of Thrones
Data:Testdata.tabx#3奈德·史塔克Game of Thrones
Data:Testdata.tabx#4奈德·史塔克Game of Thrones
Data:Testdata.tabx#5丹妮莉丝·坦格利安Game of Thrones
Data:Testdata.tabx#7丹妮莉丝·坦格利安Game of Thrones
Data:Testdata.tabx#8卓戈卡奥Game of Thrones
Data:Testdata.tabx#9猎狗Game of Thrones
  • 通过?param =xxx的形式可以指定返回表格中对应的文字

例子

{{ask
|table = Testdata.tabx
|query = Toy Category::funko;Funko Series::1;Is Released::true;Year::2012
|?Has Name = 名字
|?Has Features = 特点
|limit =5
|class= sortable
|mainlabel = funko!
}}

结果

funko!特点名字
Data:Testdata.tabx#1提利昂·兰尼斯特
Data:Testdata.tabx#10异鬼
Data:Testdata.tabx#2脸上有疤提利昂·兰尼斯特
Data:Testdata.tabx#3奈德·史塔克
Data:Testdata.tabx#4断头奈德·史塔克

查两个条件的例子

例子

{{ask
|table = Testdata.tabx
|query = Toy Category::funko;Has Name::异鬼,魔山
|?Has Name = Has Name 
|?Funko Franchise = 系列
}}

结果

Has Name系列
Data:Testdata.tabx#10异鬼Game of Thrones
Data:Testdata.tabx#109魔山Game of Thrones
Data:Testdata.tabx#11异鬼Game of Thrones
Data:Testdata.tabx#110魔山Game of Thrones
Data:Testdata.tabx#42魔山Game of Thrones
Data:Testdata.tabx#70魔山Game of Thrones

例子

{{ask
|table = Testdata.tabx
|query = Toy Category::funko;Year::2012,2016
|?Has Name = Has Name 
|?Year = 年份
}}

结果

Has Name年份
Data:Testdata.tabx#1提利昂·兰尼斯特2012
Data:Testdata.tabx#10异鬼2012
Data:Testdata.tabx#104丹妮莉丝·坦格利安和卓耿2016
Data:Testdata.tabx#2提利昂·兰尼斯特2012
Data:Testdata.tabx#3奈德·史塔克2012
Data:Testdata.tabx#4奈德·史塔克2012
Data:Testdata.tabx#49玛格丽·提利尔2016
Data:Testdata.tabx#5丹妮莉丝·坦格利安2012
Data:Testdata.tabx#50波隆2016
Data:Testdata.tabx#51乔拉·莫尔蒙2016
Data:Testdata.tabx#52史坦尼斯·拜拉席恩2016
Data:Testdata.tabx#53梅丽珊卓2016
Data:Testdata.tabx#54梅丽珊卓2016
Data:Testdata.tabx#55鹰身女妖之子2016
Data:Testdata.tabx#56夜王2016
Data:Testdata.tabx#57夜王2016
Data:Testdata.tabx#60无垢者2016
Data:Testdata.tabx#61卓耿2016
Data:Testdata.tabx#62雷哥2016
Data:Testdata.tabx#63强壮的玛格2016
Data:Testdata.tabx#7丹妮莉丝·坦格利安2012
Data:Testdata.tabx#8卓戈卡奥2012
Data:Testdata.tabx#9猎狗2012

排除条件(!)

key::!value查找所有key存在,但不是value的数据

例子

{{ask
|table = Testdata.tabx
|query = Year::!2011
|?Has Name = Has Name 
|?Funko Franchise = Franchise
|?Year = Year
|limit =20
|mainlabel = -
}}

结果

YearHas Name特点
2012提利昂·兰尼斯特
2012异鬼
2015卡奥卡丽熙和雷哥染血的卓戈和烧伤的丹妮莉丝
2017琼恩和布兰
2017琼恩和拉姆斯私生子之战
2018乔治·马丁、大卫·贝尼奥夫和丹尼尔·魏斯创作者
2016丹妮莉丝·坦格利安和卓耿骑龙
2018夜王和冰龙版韦赛利昂骑龙
2019异鬼和尸鬼马骑马
2019琼恩·雪诺和雷哥骑龙
2019丹妮莉丝·坦格利安和卓耿骑龙屠城
2019魔山戴头盔版
2013异鬼
2019魔山摘掉头盔版
2019席恩·葛雷乔伊射箭
0艾莉亚·史塔克手持双头长矛
2019夜王胸前插有匕首
2019夜王胸前插有匕首
2019布兰·史塔克“残废的”
2019琼恩·雪诺第八季

任意条件(+)

key::+查找所有key存在,是任意value的值

例子

{{ask
|table = Testdata.tabx
|query = Year::+
|?Has Name = Has Name 
|?Has Features = 特点
|?Year = Year
|limit =20
|mainlabel = -
}}

结果

YearHas Name特点
2012提利昂·兰尼斯特
2012异鬼
2015卡奥卡丽熙和雷哥染血的卓戈和烧伤的丹妮莉丝
2017琼恩和布兰
2017琼恩和拉姆斯私生子之战
2018乔治·马丁、大卫·贝尼奥夫和丹尼尔·魏斯创作者
2016丹妮莉丝·坦格利安和卓耿骑龙
2018夜王和冰龙版韦赛利昂骑龙
2019异鬼和尸鬼马骑马
2019琼恩·雪诺和雷哥骑龙
2019丹妮莉丝·坦格利安和卓耿骑龙屠城
2019魔山戴头盔版
2013异鬼
2019魔山摘掉头盔版
2019席恩·葛雷乔伊射箭
0艾莉亚·史塔克手持双头长矛
2019夜王胸前插有匕首
2019夜王胸前插有匕首
2019布兰·史塔克“残废的”
2019琼恩·雪诺第八季

不存在的条件(~)

当有一些数据根本没有某个字段时,我们要如何查找他们(查询空气!这是SMW做不到的): key::~

例子

{{ask
|table = Testdata.tabx
|query = Has Link::~;Has Name::+
|?Has Name = 名字
|limit =20
}}

结果

名字
Data:Testdata.tabx#1提利昂·兰尼斯特
Data:Testdata.tabx#10异鬼
Data:Testdata.tabx#100卡奥卡丽熙和雷哥
Data:Testdata.tabx#101琼恩和布兰
Data:Testdata.tabx#102琼恩和拉姆斯
Data:Testdata.tabx#103乔治·马丁、大卫·贝尼奥夫和丹尼尔·魏斯
Data:Testdata.tabx#104丹妮莉丝·坦格利安和卓耿
Data:Testdata.tabx#105夜王和冰龙版韦赛利昂
Data:Testdata.tabx#106异鬼和尸鬼马
Data:Testdata.tabx#107琼恩·雪诺和雷哥
Data:Testdata.tabx#108丹妮莉丝·坦格利安和卓耿
Data:Testdata.tabx#109魔山
Data:Testdata.tabx#11异鬼
Data:Testdata.tabx#110魔山
Data:Testdata.tabx#111席恩·葛雷乔伊
Data:Testdata.tabx#112艾莉亚·史塔克
Data:Testdata.tabx#113夜王
Data:Testdata.tabx#114夜王
Data:Testdata.tabx#115布兰·史塔克
Data:Testdata.tabx#116琼恩·雪诺

大于 or 小于(</>)

key::>value

key::<value

例子

{{ask
|table = Testdata.tabx
|query = Year::>2010
|?Has Name = Has Name 
|?Has Features = 特点
|?Year = Year
|sort = Year
|order = 1
|limit =20
|mainlabel = -
}}

结果

特点Has NameYear
脸上有疤提利昂·兰尼斯特2012
提利昂·兰尼斯特2012
断头奈德·史塔克2012
奈德·史塔克2012
丹妮莉丝·坦格利安2012
卓戈卡奥2012
异鬼2012
猎狗2012
红龙丹妮莉丝·坦格利安2012
金龙丹妮莉丝·坦格利安2013
异鬼2013
染血版琼恩·雪诺2013
塞外版琼恩·雪诺2013
琼恩·雪诺2013
罗柏·史塔克2013
詹姆·兰尼斯特2013
艾莉亚·史塔克2013
瑟曦·兰尼斯特2014
蓝礼·拜拉席恩2014
塔斯的布蕾妮2014

使用正则表达式(@)

key::@re

下面这个例子是在查找所有叫 xxxx·兰尼斯特的Funko玩偶

{{ask
|table = Testdata.tabx
|query = Has Name::@.*兰尼斯特
|?Has Name = Has Name 
|?Funko Franchise = Franchise
|?Year = Year
|sort = Year
|order = 1
|limit =20
|mainlabel = -
}}

结果

FranchiseHas NameYear
Game of Thrones提利昂·兰尼斯特2012
Game of Thrones提利昂·兰尼斯特2012
Game of Thrones詹姆·兰尼斯特2013
Game of Thrones瑟曦·兰尼斯特2014
Game of Thrones泰温·兰尼斯特2014
Game of Thrones泰温·兰尼斯特2014
Game of Thrones提利昂·兰尼斯特2014
Game of Thrones詹姆·兰尼斯特2015
Game of Thrones提利昂·兰尼斯特2017
Game of Thrones瑟曦·兰尼斯特2017
Game of Thrones提利昂·兰尼斯特2019
Game of Thrones瑟曦·兰尼斯特2019

结果

统计

|format = count 例子

{{ask
|table = Testdata.tabx
|query = Toy Category::funko;Is Released::true;Limit::!通版
|?Has Name = 名字
|?Funko Franchise = 系列
|?Year = 年份
|format =count
|mainlabel = funko!
}}

结果: 37

排序

|sort = <sort-key>

|order = <order>

order = 1 |asc | ascending | -1 | desc | descending | reverse
  • 升序:1,asc,ascending
  • 反序:-1,desc,descending,reverse

不支持乱序(随机),因为Mongo没有……

例子

{{ask
|table = Testdata.tabx
|query = Toy Category::funko;Is Released::true;Limit::!通版
|?Has Name = 名字
|?Has Features = 特点
|?Year = 年份
|sort =Year
|order = reverse
|limit = 20
|class= sortable
|mainlabel = funko!
}}

结果

funko!特点名字年份
Data:Testdata.tabx#59夜王2019
Data:Testdata.tabx#91铁王座版夜王2019
Data:Testdata.tabx#93刺客版艾莉亚·史塔克2019
Data:Testdata.tabx#94娜梅莉亚2019
Data:Testdata.tabx#69落雪版巨人克星托蒙德2018
Data:Testdata.tabx#75尸鬼巨人2018
Data:Testdata.tabx#79奥莲娜·雷德温2018
Data:Testdata.tabx#80举着燃烧的长剑贝里·唐德利恩2018
Data:Testdata.tabx#85森林之子2018
Data:Testdata.tabx#95乔治·马丁2018
Data:Testdata.tabx#103创作者乔治·马丁、大卫·贝尼奥夫和丹尼尔·魏斯2018
Data:Testdata.tabx#58夜王2017
Data:Testdata.tabx#72莱安娜·莫尔蒙2017
Data:Testdata.tabx#70战甲版魔山2017
Data:Testdata.tabx#73贾坤2017
Data:Testdata.tabx#101琼恩和布兰2017
Data:Testdata.tabx#54梅丽珊卓2016
Data:Testdata.tabx#57夜王2016
Data:Testdata.tabx#61卓耿2016
Data:Testdata.tabx#63强壮的玛格2016

多关键词排序

|sort = key1, key2

|order = order1,order2

支持多个参数排序,关键词用,隔开(依然与SMW一致)

  • order的数量少于sort的时候,会自动用“1”(升序)补齐
  • order的数量多于sort的时候,多余的部分无效

例子

{{ask
|table = Testdata.tabx
|query = Toy Category::funko;Is Released::true;Limit::!通版
|?Has Name = 名字
|?Year = 年份
|?Funko Series = 系列
|?Funko Index = index
|sort =Year,Funko Index
|order = reverse,asc
|limit = 20
}}

结果

系列index名字年份
Data:Testdata.tabx#59644夜王2019
Data:Testdata.tabx#911074夜王2019
Data:Testdata.tabx#931076艾莉亚·史塔克2019
Data:Testdata.tabx#949976娜梅莉亚2019
Data:Testdata.tabx#103980乔治·马丁、大卫·贝尼奥夫和丹尼尔·魏斯2018
Data:Testdata.tabx#95991乔治·马丁2018
Data:Testdata.tabx#69753巨人克星托蒙德2018
Data:Testdata.tabx#75860尸鬼巨人2018
Data:Testdata.tabx#79864奥莲娜·雷德温2018
Data:Testdata.tabx#80865贝里·唐德利恩2018
Data:Testdata.tabx#85969森林之子2018
Data:Testdata.tabx#101980琼恩和布兰2017
Data:Testdata.tabx#58644夜王2017
Data:Testdata.tabx#70754魔山2017
Data:Testdata.tabx#72756莱安娜·莫尔蒙2017
Data:Testdata.tabx#73757贾坤2017
Data:Testdata.tabx#54642梅丽珊卓2016
Data:Testdata.tabx#57644夜王2016
Data:Testdata.tabx#61646卓耿2016
Data:Testdata.tabx#63648强壮的玛格2016

用隐藏关键词排序

甚至可以把没有查询的字段拿来排序(前提是存在),这一点SMW是做不到的

例子

{{ask
|table = Testdata.tabx
|query = Toy Category::funko;Is Released::true;Limit::!通版
|?Has Name = 名字
|?Has Features = 特点
|?Year = 年份
|?Funko Series = 系列
|sort =Year,Funko Index
|order = reverse,asc
|limit = 20
}}

结果

系列特点年份名字
Data:Testdata.tabx#5962019夜王
Data:Testdata.tabx#9110铁王座版2019夜王
Data:Testdata.tabx#9310刺客版2019艾莉亚·史塔克
Data:Testdata.tabx#94992019娜梅莉亚
Data:Testdata.tabx#10398创作者2018乔治·马丁、大卫·贝尼奥夫和丹尼尔·魏斯
Data:Testdata.tabx#95992018乔治·马丁
Data:Testdata.tabx#697落雪版2018巨人克星托蒙德
Data:Testdata.tabx#7582018尸鬼巨人
Data:Testdata.tabx#7982018奥莲娜·雷德温
Data:Testdata.tabx#808举着燃烧的长剑2018贝里·唐德利恩
Data:Testdata.tabx#8592018森林之子
Data:Testdata.tabx#101982017琼恩和布兰
Data:Testdata.tabx#5862017夜王
Data:Testdata.tabx#707战甲版2017魔山
Data:Testdata.tabx#7272017莱安娜·莫尔蒙
Data:Testdata.tabx#7372017贾坤
Data:Testdata.tabx#5462016梅丽珊卓
Data:Testdata.tabx#5762016夜王
Data:Testdata.tabx#6162016卓耿
Data:Testdata.tabx#6362016强壮的玛格

隐藏第一列

|mainlabel =-

例子

{{ask
|table = Testdata.tabx
|query = Toy Category::funko;Funko Series::1;Is Released::true;Year::2012
|?Has Name = 名字
|?Has Features = 特点
|limit =5
|mainlabel = -
}}

结果

名字特点
提利昂·兰尼斯特
异鬼
提利昂·兰尼斯特脸上有疤
奈德·史塔克
奈德·史塔克断头

隐藏第一行

|headers=hide

例子

{{ask
|table = Testdata.tabx
|query = Toy Category::funko;Funko Series::1;Is Released::true;Year::2012
|?Has Name = 名字
|?Has Features = 特点
|limit =5
|mainlabel = -
|headers =hide
}}

结果

提利昂·兰尼斯特
异鬼
提利昂·兰尼斯特脸上有疤
奈德·史塔克
奈德·史塔克断头

用模板封装

SMongo支持使用template作为format,|format=template 与SMW的ask函数基本一致

  • 注意,默认为序号参,{{{1}}}是数据列的id,查询返回的结果是从{{{2}}}开始(与SMW一致)
参数 说明 备注
template 主模板,返回的每个结果都会被扔进这个模板处理 必须
introtemplate 前置模板
outrotemplate 后置模板
userparam 添加用户自定义的参数,模板内引用方法为{{{userparam}}}
named args 只要等号后值不为空,即可开启命名参数模式,模板内的参数形如{{{?Has Name}}}与SMW完全一致

例子

{{ask
|table = Testdata.tabx
|query = Toy Category::funko;Funko Series::1;Is Released::true;Year::2012
|?Has Name = 1
|?Funko Franchise = 1
|limit =20
|format =template
|named args = yes
|template = ask/1
|introtemplate =ask/0
|outrotemplate =ask/2
}}

结果

模板:Ask/0 - intro 模板
姓名:提利昂·兰尼斯特
Game of Thrones
姓名:异鬼
Game of Thrones
姓名:提利昂·兰尼斯特
Game of Thrones
姓名:奈德·史塔克
Game of Thrones
姓名:奈德·史塔克
Game of Thrones
姓名:丹妮莉丝·坦格利安
Game of Thrones
姓名:丹妮莉丝·坦格利安
Game of Thrones
姓名:卓戈卡奥
Game of Thrones
姓名:猎狗
Game of Thrones
模板:Ask/2 - outro 模板

debug模式

在参数中加入|debug=1 (其实等于几都行)来开启debug模式,获得各种参数,

例子

{{ask
|table = Testdata.tabx
|query = Toy Category::funko;Funko Series::1;Is Released::true;Year::2012
|?Has Name = y
|?Funko Franchise = y
|limit =5
|debug=1
}}

结果

yy
Data:Testdata.tabx#1Game of Thrones提利昂·兰尼斯特
Data:Testdata.tabx#10Game of Thrones异鬼
Data:Testdata.tabx#2Game of Thrones提利昂·兰尼斯特
Data:Testdata.tabx#3Game of Thrones奈德·史塔克
Data:Testdata.tabx#4Game of Thrones奈德·史塔克
DEBUG信息
查询条件(query)
table#1 {
 ["Funko Series"] = table#2 {
   ["$in"] = table#3 {
     1,
   },
 },
 ["Is Released"] = table#4 {
   ["$in"] = table#5 {
     1,
   },
 },
 ["Toy Category"] = table#6 {
   ["$in"] = table#7 {
     "funko",
   },
 },
 ["Year"] = table#8 {
   ["$in"] = table#9 {
     2012,
   },
 },
}
查询选项(options)
table#1 {
 ["limit"] = 5,
 ["sort"] = table#2 {
   ["_id"] = 1,
 },
}
查询返回数据(nil为空)
table#1 {
 table#2 {
   ["Data Toys"] = "Data:Funko1",
   ["Funko Category"] = "Funko Pop!",
   ["Funko Franchise"] = "Game of Thrones",
   ["Funko Index"] = 1,
   ["Funko Series"] = 1,
   ["Has Image"] = "01权力的游戏funkopop系列1提利昂.jpg",
   ["Has Link"] = "提利昂·兰尼斯特",
   ["Has Name"] = "提利昂·兰尼斯特",
   ["In Bundle"] = false,
   ["Is Released"] = 1,
   ["Limit"] = "通版",
   ["Toy Category"] = "funko",
   ["Year"] = 2012,
   ["_id"] = "Data:Testdata.tabx#1",
   ["wiki_index"] = 1,
 },
 table#3 {
   ["Data Toys"] = "Data:Funko10",
   ["Funko Category"] = "Funko Pop!",
   ["Funko Franchise"] = "Game of Thrones",
   ["Funko Index"] = 6,
   ["Funko Series"] = 1,
   ["Has Image"] = "06权力的游戏funkopop系列1异鬼.jpg",
   ["Has Link"] = "异鬼",
   ["Has Name"] = "异鬼",
   ["In Bundle"] = false,
   ["Is Released"] = 1,
   ["Limit"] = "通版",
   ["Toy Category"] = "funko",
   ["Year"] = 2012,
   ["_id"] = "Data:Testdata.tabx#10",
   ["wiki_index"] = 10,
 },
 table#4 {
   ["Data Toys"] = "Data:Funko2",
   ["Funko Category"] = "Funko Pop!",
   ["Funko Franchise"] = "Game of Thrones",
   ["Funko Index"] = 1,
   ["Funko Series"] = 1,
   ["Has Features"] = "脸上有疤",
   ["Has Image"] = "01权力的游戏funkopop系列1提利昂刀疤.png",
   ["Has Link"] = "提利昂·兰尼斯特",
   ["Has Name"] = "提利昂·兰尼斯特",
   ["In Bundle"] = false,
   ["Is Released"] = 1,
   ["Limit"] = "PopCultcha",
   ["Toy Category"] = "funko",
   ["Year"] = 2012,
   ["_id"] = "Data:Testdata.tabx#2",
   ["wiki_index"] = 2,
 },
 table#5 {
   ["Data Toys"] = "Data:Funko3",
   ["Funko Category"] = "Funko Pop!",
   ["Funko Franchise"] = "Game of Thrones",
   ["Funko Index"] = 2,
   ["Funko Series"] = 1,
   ["Has Image"] = "02权力的游戏funkopop系列1奈德.jpg",
   ["Has Link"] = "奈德·史塔克",
   ["Has Name"] = "奈德·史塔克",
   ["In Bundle"] = false,
   ["Is Released"] = 1,
   ["Limit"] = "通版",
   ["Toy Category"] = "funko",
   ["Year"] = 2012,
   ["_id"] = "Data:Testdata.tabx#3",
   ["wiki_index"] = 3,
 },
 table#6 {
   ["Data Toys"] = "Data:Funko4",
   ["Funko Category"] = "Funko Pop!",
   ["Funko Franchise"] = "Game of Thrones",
   ["Funko Index"] = 2,
   ["Funko Series"] = 1,
   ["Has Features"] = "断头",
   ["Has Image"] = "02权力的游戏funkopop系列1断头奈德SDCC2013.jpg",
   ["Has Link"] = "奈德·史塔克",
   ["Has Name"] = "奈德·史塔克",
   ["In Bundle"] = false,
   ["Is Released"] = 1,
   ["Limit"] = "SDCC",
   ["Toy Category"] = "funko",
   ["Year"] = 2012,
   ["_id"] = "Data:Testdata.tabx#4",
   ["wiki_index"] = 4,
 },
}
传入的参数(args)
table#1 {
 metatable = table#2
 ["?Funko Franchise"] = "y",
 ["?Has Name"] = "y",
 ["debug"] = "1",
 ["limit"] = "5",
 ["query"] = "Toy Category::funko;Funko Series::1;Is Released::true;Year::2012",
 ["table"] = "Testdata.tabx",
}
传入的模板参数(format=template)
table#1 { }
模板参数是否为命名参(namedArgs)
"unkown"
Schema Table
table#1 {
 table#2 {
   ["name"] = "datatoys",
   ["title"] = table#3 {
     ["en"] = "Data Toys",
   },
   ["type"] = "string",
 },
 table#4 {
   ["name"] = "wiki_index",
   ["title"] = table#5 {
     ["en"] = "wiki_index",
   },
   ["type"] = "number",
 },
 table#6 {
   ["name"] = "toycategory",
   ["title"] = table#7 {
     ["en"] = "Toy Category",
   },
   ["type"] = "string",
 },
 table#8 {
   ["name"] = "funkoindex",
   ["title"] = table#9 {
     ["en"] = "Funko Index",
   },
   ["type"] = "number",
 },
 table#10 {
   ["name"] = "funkofranchise",
   ["title"] = table#11 {
     ["en"] = "Funko Franchise",
   },
   ["type"] = "string",
 },
 table#12 {
   ["name"] = "funkoseries",
   ["title"] = table#13 {
     ["en"] = "Funko Series",
   },
   ["type"] = "number",
 },
 table#14 {
   ["name"] = "isreleased",
   ["title"] = table#15 {
     ["en"] = "Is Released",
   },
   ["type"] = "boolean",
 },
 table#16 {
   ["name"] = "hasname",
   ["title"] = table#17 {
     ["en"] = "Has Name",
   },
   ["type"] = "string",
 },
 table#18 {
   ["name"] = "haslink",
   ["title"] = table#19 {
     ["en"] = "Has Link",
   },
   ["type"] = "string",
 },
 table#20 {
   ["name"] = "limit",
   ["title"] = table#21 {
     ["en"] = "Limit",
   },
   ["type"] = "string",
 },
 table#22 {
   ["name"] = "year",
   ["title"] = table#23 {
     ["en"] = "Year",
   },
   ["type"] = "number",
 },
 table#24 {
   ["name"] = "funkocategory",
   ["title"] = table#25 {
     ["en"] = "Funko Category",
   },
   ["type"] = "string",
 },
 table#26 {
   ["name"] = "inbundle",
   ["title"] = table#27 {
     ["en"] = "In Bundle",
   },
   ["type"] = "boolean",
 },
 table#28 {
   ["name"] = "hasimage",
   ["title"] = table#29 {
     ["en"] = "Has Image",
   },
   ["type"] = "string",
 },
 table#30 {
   ["name"] = "hasfeatures",
   ["title"] = table#31 {
     ["en"] = "Has Features",
   },
   ["type"] = "string",
 },
 table#32 {
   ["name"] = "special",
   ["title"] = table#33 {
     ["en"] = "Special",
   },
   ["type"] = "string",
 },
 table#34 {
   ["name"] = "specialsize",
   ["title"] = table#35 {
     ["en"] = "Special Size",
   },
   ["type"] = "string",
 },
}
检查代码1
"101"
检查代码2
"101"
avatar
avatar
1

好高级的样子,看了两天,还是不太会orz……不知道可以怎么用在站点上

8个月
avatar
SerGawen
1
这个使用场景是建立在结构化数据上的,文学类的站点一般数据化程度较低,我提供一个思路
1.使用updater把某个分类下的信息爬到excel上(比如角色、地点等)
2.再将excel存到data页面进入mongoDB
3.可以使用SMongo或者直接用Lua对已经入库的数据进行聚合查询,比如列出所有是精灵的人物,所有和洛汗有关的角色等等
4.将上述数据收录到特定的统计性质的页面里,也可以直接把上述聚合果的结构化数据扔给ECharts进行处理,生成各种表格,或者扔给可视化地图制作一些互动地标等等
8个月
avatar
0

回复@SerGawen:好的,谢谢加文

5个月