命令行处理器命令

在你开始前

DB2 JSON可用于Linux,UNIX和Windows 10.5的DB2以及用于z / OS V3.1的IBM DB2 Accessories Suite来与DB2 for z / OS V10一起使用。 它提供以下功能,如图1所示:

  • 用于管理和查询JSON数据的命令行外壳。
  • 用于应用程序开发的Java™API。
  • 有线侦听器接受并响应通过网络发送的请求。
图1. DB2 JSON组件

了解对本文的期望以及如何最大程度地利用本文

本文介绍了DB2的基本功能,以管理JSON数据并在命令行外壳程序中执行查询。 它指导您完成以下任务:

  1. 建立
  2. 处理馆藏和文件
  3. 行政
  4. 清理

有关一般概述以及其他组件的详细信息,请参阅本系列的其他文章。

建立

系统先决条件

要完成以下步骤,您必须至少在系统上安装了用于Linux,UNIX和Windows的IBM DB2 10.5,或者使用IBM DB2 Accessories Suite for z / OS V3.1来启用DB2 for z / OS V10作为JSON数据存储区。 应用适用于您的数据库平台的以下步骤。

Linux,Unix和Windows上的IBM DB2

为了简化本文中示例的管理授权要求,请确保对要使用的数据库具有DBADM权限。 如果按照本节所述创建数据库,则会自动分配必要的权限。

建立资料库

在此步骤中,将创建一个适用于后续示例的数据库。 使用DB2命令窗口或首选的DB2管理工具来执行命令,如清单1所示。

清单1.创建数据库的命令
CREATE DATABASE myjsondb automatic storage yes using codeset utf-8 territory US collate using system  pagesize 32 k

另外,记下数据库服务器的主机名或IP地址以及端口号。 在准备和启动JSON命令行处理环境中的以下步骤中需要使用它们。

IBM DB2 z / OS版

应用程序可以在分布式系统平台上使用DB2 JSON API或DB2 JSON WireListener,并使用DB2 Connect JDBC驱动程序将DB2 for z / OS用作JSON数据存储。

此部署方案需要以下组件:

  • 带有DB2 JSON和DB2驱动程序组件的DB2 10.5 FP3(或更高版本),用于Linux,Unix和Windows服务器或客户机安装。 安装后,这些组件位于SQLLIB / json中。
  • 用于z / OS V3.1的DB2附件套件。
  • 具有必需的APAR的DB2 for z / OS版本10。 有关先决条件和将DB2 JSON与DB2 for z / OS一起安装的详细信息,请参见APAR II14727。

在分布式系统上对数据库进行编目,并记下连接信息或z / OS上DB2数据库的URL,以进行下一步。

准备并启动JSON命令行处理环境

命令行处理器以db2nosql脚本(位于<db2home> / sqllib / json / bin目录中)启动,并且需要数据库连接信息。 为确保解决依赖关系,请验证以下内容:

  • 路径中包含Java运行时环境(最低JRE 1.5)。
  • CLASSPATH包括JDBC驱动程序(db2jcc.jar版本3.66或更高版本或db2jcc4.jar)。

该脚本假定数据库位于localhost:50000上,除非您使用-hostName和-port选项指定其他位置或端口。 使用-help选项获得更多详细信息,如清单2所示。

清单2.使用db2nosql脚本的示例
db2nosql -helpdb2nosql -db bobdb  -user bob -password mypassworddb2nosql -hostName bob.bobhome.com -port 50003 -db bobdb  -user bob -password mypwd

脚本参数提示:

  • 数据库名称是必需的。 如果未提供数据库名称,脚本将提示您输入数据库名称。
  • 如果提供用户名但未提供密码,则脚本将提示您输入密码。
  • 如果既未提供用户名也未提供密码,则脚本将尝试进行JDBC-Type2连接,该连接使用操作系统的登录用户。

提示 :复制脚本并编辑副本以提供硬编码值,以简化启动特定设置的处理环境的过程。

JSON命令行处理器将显示“ nosql”提示,如清单3的示例摘录所示。

清单3.命令行处理器
nosql>Type your JSON query and end it with <ENTER>
nosql>Type help() or help for usage information

启用DB2数据库

对于Linux,Unix和Windows上的DB2 ,运行脚本,然后在命令行处理环境中,键入enable(true)为DB2 JSON命令准备数据库。 此步骤将添加必要的系统对象,并且对于数据库仅需要一次,如清单4所示。

清单4.启用数据库
nosql>enable(true)
Executing SQL...
Database Artifacts created successfully
nosql>

使用enable(false)选项将打印关联的DDL,但不会执行该命令。

使用DB2 for z / OS时 ,启用数据库将由DB2 for z / OS数据库或系统管理员作为一次性安装任务执行。 z / OS不支持通过db2nosql命令行工具启用该功能。 有关使用DB2 z / OS版启用DB2 JSON的详细信息,请参见APAR PM98357。

启用数据库之后,使用z / OS上的DB2数据库的连接信息或URL启动db2nosql脚本。

选择JSON名称空间

使用DB2作为JSON文档存储库,可以通过使用DB2 SQL模式作为限定符来定义多个JSON名称空间。 默认情况下,名称TEST设置为JSON名称空间,但是,最好use命令use选择自定义名称。 此JSON名称空间(又名DB2 SQL模式名称)将用于活动会话,直到选择了新的JSON名称空间为止,如清单5所示。

清单5.显示和设置JSON名称空间
nosql>dbs
SCHEMAS: [TEST]
nosql>use myown
Switched to schema MYOWN
nosql>dbs
SCHEMAS: [MYOWN,TEST]

请注意,名称空间(模式名称)不区分大小写。

要验证当前的DB2数据库连接,请在nosql-commandline处理器中键入db ,如清单6所示。

清单6.显示当前数据库连接
nosql>db
Database: jdbc:db2://localhost:50000/myjsondb Schema: TEST

带有db的前缀命令可与选定的名称空间或名称空间中的集合一起使用。 db前缀是一种便捷快捷方式,在执行命令时将被映射为构建完全限定的名称。

处理馆藏和文件

使用隐式创建的集合存储和查询文档

使用DB2 JSON功能,JSON文档被组织在集合中。 JSON集合不强制执行集合模式或文档结构,但是,集合中的文档通常具有共同的特征,以使其更易于搜索(和查找)数据。

与关系表相反,因此不必为集合定义表结构。 要插入文档,只需指定集合的​​名称即可,如果该集合尚不存在,则会自动创建它。 在这种情况下,如果文档包含标识符,即用属性名_id标记的字段,则该字段将用作唯一标识符,并且期望所有新文档都将包含相同数据类型的_id 。

如果初始文档中不存在此类属性,则系统使用生成的对象标识符来唯一标识每个文档。 如果以后插入的文档包含_id字段,则数据类型必须适合VARCHAR(12)FOR BIT字段,否则文档将被拒绝。

要插入文档,请使用命令db.<collectionName>.insert(<document>) ,如清单7所示。

清单7.插入一个文档(为便于阅读而格式化)
nosql>db.books.insert({isbn: "123-456-789", author: "Verne, Jules", title: "Journey to the Center of the Earth", abstract: "Classic science fiction novel in an unusual setting", price: 6.00, pages: 276, category: "Fantasy",sales: 500.50})

上一个示例文档包含三种不同的数据类型,字符串(例如Verne,Jules),数字(例如6.00)和整数(例如276)。 由于它不包含以属性名_id标记的字段,因此系统使用生成的对象标识符来唯一地标识文档。

表1列出了常见的数据类型。 请参阅DB2 JSON参考文档以获得包含完整列表的参考。

表1.常见数据类型
数据类型 允许索引 评论
$字符串 ÿ
$ int,$ integer,$ long ÿ 整数,长 $ int:123
$ number ÿ 双浮 $ number:123.45
$ date ÿ 必须采用以下格式:'yyyy-mm-ttThh:mm:ssZ $ date:'2013-05-18T18:56:00Z'
$时间戳 ÿ 时间戳记
$二进制 ÿ 字节数组
$ oid ÿ 对象标识符(二进制)

您可以使用find()命令查询数据,如清单8所示。对于示例文档,已经创建了一个名为books的集合,并带有一个自动生成的二进制对象标识符。 请注意,集合名称区分大小写。

清单8.列出所有文档
nosql>db.books.find()
nosql>Row 1:
nosql> {
nosql> "_id":{"$oid":"519b8727cd1552ed65b47a20"},
nosql> "isbn":"123-456-789",
nosql> "author":"Verne, Jules",
nosql> "title":"Journey to the Center of the Earth",
nosql> "abstract":"Classic science fiction novel in an unusual setting",
nosql> "price":6,
nosql> "pages":276,
nosql> "category":"Fantasy",
nosql> "sales": 500.5
nosql> }

对于新文档, _id的数据类型必须符合集合的_id数据类型,在此示例中为二进制数据类型。 尝试插入一个显式_id与预期数据类型不匹配的新文档将导致错误,如清单9所示。

清单9.错误案例:插入一个错误的_id数据类型的文档(格式化的)
nosql>db.books.insert({_id: "123-456-788", author: "Verne, Jules", title: "Journey to the Center of the Earth", abstract: "Classic science fiction novel in an unusual setting", price: 6.00, pages: 276,category: "Fantasy",sales: 500.50})nosql> Error:[nosql][1.0.146] DBException;Caused by: [jcc][1083][10403][3.66.33] Illegal conversion: can not convert from"java.lang.String" to "byte[]" ERRORCODE=-4474, SQLSTATE=null

显式创建集合

在前面的示例中,集合是使用第一个文档自动创建的。 但是,自动创建的集合使用默认设置,因此通常希望使用自定义设置显式创建集合,如清单10所示。

清单10.创建一个名为'media'的集合,其中_id的类型为long
nosql>db.createCollection(“media”, {_id: “$long”)})
Collection: TEST."media" created. Use db.media.

请注意,在集合的定义中仅指定了用作唯一标识符的文档_id 。 JSON文档无需架构即可存储,因此不需要文档架构定义。

定制设置还可以用于启用DB2功能(例如压缩和时间旅行),分配表空间和控制缓冲池的使用。

注意,DB2 for z / OS中的JSON集合不支持双向功能和时间旅行查询。 一些限制也适用于集合存储特征,例如,DB2 for z / OS的createCollection命令当前不支持TABLESPACE选项。

请参阅相关的主题部分的链接,DB2信息中心,详细了解表空间和缓冲池管理,压缩和时间旅行的特点。 要了解有关DB2 JSON应用程序的更多信息,请参阅本系列的其他文章。

汇入文件

除了用于单个文档的插入命令外,还可以从文件导入数据。 从Downloadable资源中下载示例文件,以执行以下步骤,如清单11所示。

清单11.从文件导入文档
nosql>db.books.importFile(“books_import.js”)
14 objects were imported

提示:如果命令返回“找不到文件”错误,请使用绝对文件位置。

import命令还允许您设置提交频率,如清单12所示。较大的批次可以提高吞吐量。

清单12.批量导入文档
nosql>db.books.importFile(“books_import.js”, 100)

导入的文件必须包含JSON表示法的有效文档。 如果文件包含无效文档,则将为每个此类格式错误的文档报告一个错误。

JSON集合不强制执行集合模式或文档结构。 但是,应用程序通常期望文档具有某种结构上的共性。 也就是说,JSON集合并非完全没有架构,而是为文档架构提供了灵活性。 要获取有关集合的可能结构的信息,请使用sampleSchema()命令。 此命令分析文档的子集,并返回属性列表及其出现的次数,如清单13所示。

清单13.查找有关文档结构的信息
nosql>db.books.sampleSchema(){"._id":"15;type:ObjectId",".abstract":"15;type:String",".author":"15;type:String",".category":"12;type:String",".isbn":"15;type:String",".pages":"14;type:Integer",".price":"14;type:Double",".sales":"13;type:Double",".title":"15;type:String",".year_published":"5;type:Integer"}

在此示例中,大多数属性都出现在所有文档中,但“类别”,“销售”,“年出版”,“页面”和“价格”属性除外。

查询JSON文档

find命令db.<collection>.find(<conditions>, <projection list>)允许通过指定条件(类似于SQL where子句)来选择有趣的文档,如清单14所示,并允许定制结果输出(类似于SQL select语句)。

清单14.搜索具有特定作者姓名的文档
nosql>db.books.find({author: "Tolkien, J.R"})

上面的示例返回JR Tolkien的书籍的所有属性,包括自动生成的标识符。 要选择应返回文档的哪些属性,可以使用投影列表提交查询,该投影列表指示要从结果中包括或排除哪些属性。 使用以下内容:

  • 1 –包含属性
  • 0 –排除属性

提示:您可以在同一投影中使用包含或排除,但不能同时使用-例外:除了包含字段的列表之外,您仍然可以排除_id,如清单15所示。

清单15.选择特定的文档属性
Search for titles and prices of the documents with this author:nosql>db.books.find({author: "Tolkien, J.R"}, {title: 1, price:1})Search for titles and prices of the documents with this author in this category:nosql>db.books.find({author: "Tolkien, J.R", category: “Fantasy”}, {title: 1, price:1})Search for titles and prices of the documents with this author in this category,
but exclude the _id:nosql>db.books.find({author: "Tolkien, J.R", category: “Fantasy”},
{_id: 0, title: 1, price:1})

请注意, _id会自动包含在内,除非明确排除了它。

您可以使用比较运算符和联接运算符来选择文档,如清单16所示。

清单16.使用比较值搜索文档
Search author, sales and price for books with sales less than 300, exclude the _id:nosql>db.books.find({sales: {$lt:300}},{_id:0, author:1, sales:1, price:1})

表2列出了最常用的运算符。

表2.比较和联接运算符
操作员 用法
$ eq 等于 作者:{$ eq:“ Lindgren,Astrid”};
等于默认符号 作者:“林格伦,阿斯特丽德”
$ lte 小于或等于 网页:{$ lte:200}
$ lt 少于 价格:{$ lt:6.50}
$ gte 大于或等于 author.lastname:{$ gte:“ Doe”}
$ gt 比...更棒 评分:{$ gt:3}
$ ne 不相等 状态:{$ ne:1}
$ in 一组值的成员 year_published:{$ in:[1990,1991,1992]}
$ nin 不是一组值的成员 year_published:{$ nin:[2012,2013]}
$和 两者都必须是真的 $ and:[{“ rating”:5},{“ category”:“神秘”}]
$和通过使用逗号作为分隔符 “类别”:“神秘”,“评分”:5
$或 至少一个必须为真 $ or:[{“ rating”:5},{“ category”:“神秘”}]
$ nor 都不是真的 $ nor:[{“ rating”:3},{“ category”:“ Mystery”}]
$ not 逻辑不(不匹配) $ not:{“ rating”:1}

结果集的控制选项

通常对输出进行排序非常有用,例如,首先列出最高或最低值,或者对文档进行排序,以便可以更轻松地找到值。 可以通过在sort()函数中列出一个或多个属性,并对每个属性指定是升序(= 1)还是降序(= -1)来对JSON查询中的属性进行排序,如清单17所示。

清单17.搜索书籍并对结果进行排序
Search books with sales less than 300, lowest price first:nosql>db.books.find({sales: {$lt:300}},{_id:0, author:1, sales:1, price:1}).sort({price: 1})Search books with sales less than 300,
sort on lowest price and largest number of pages within:nosql>db.books.find({sales: {$lt:300}},{_id:0, author:1, pages:1, price:1}).sort({price: 1, pages: -1})

如果许多文档符合标准,则取决于应用程序的需求,检索潜在结果的子集可能就足够了。 要指定应返回的最大文档数,请对查询使用limit()函数,如清单18所示。

清单18.限制结果数
nosql>db.books.find({sales: {$lt:300}},{_id:0, author:1, pages:1, sales:1}).limit(3)

限制结果集还可以用于通过使用函数skip()向查询添加偏移量来浏览更大的结果集,如清单19所示。

清单19.浏览结果
nosql>db.books.find({sales: {$lt:300}},{_id:0, author:1, pages:1, sales:1}).limit(3).skip(3)

如果只需要一个结果,可以使用findOne()函数来方便使用,如清单20所示。

清单20.查找第一个匹配的文档
nosql>db.books.findOne({author: "Tolkien, J.R"}, {title: 1, price:1})

汇总数据

对于大量文档,通常希望汇总一组文档的结果。 为此,可以使用各种功能来获取有关文档数量或文档组的不同值或计算出的聚合值的信息。

要检索符合指定查询条件的文档数,请使用count()函数,如清单21所示。

清单21.计数文件
Get the total count of documents in this collection:nosql>db.books.count()
15Get the number of documents for this author:nosql>>db.books.count({author: "Tolkien, J.R"})
2

要在一组数据中为属性找到不同的值,请对该属性使用distinct()函数,如清单22所示。

清单22.查找不同的值
nosql>db.books.distinct("author")

要应用查询或使用多个键值,请参阅本系列的下一篇文章:使用DB2 JSON Java API。

count()distinct()函数是用于特定目的的便捷函数,可以代替更一般的group()函数使用。 例如,还可以通过属性上的group()函数找到不同的值,如清单23所示。

清单23.使用group()命令查找不同的值
nosql>db.books.group({"_id": {"author": 1}})

group()函数还允许指定复合分组键,并定义聚合函数,例如,以计算总和或平均值,如清单24所示。

清单24.计算每位作者的平均书籍价格
nosql>db.books.group({"_id": {"author": 1}, "avgprice": {"$avg": "$price"}} )

对于更复杂的查询,可以使用aggregate()函数。 它允许您按一系列步骤描述查询,以便中间结果可以再次用作后续步骤的输入。 例如,计算每位作者的平ASP格,或使用以下查询首先选择类别为“ Fantasy”的所有文档,然后从文档中选择作者和价格属性,然后按作者分组以计算平ASP格,如清单25所示。 。

清单25.计算类别中每个作者的平均书籍价格(格式化的)
nosql>db.books.aggregate({$match:   { category: "Fantasy" }}, {$project: {author:1, price:1}},{$group:   {_id: {author:1}, avgPrice:{$avg:"$price"}}} )nosql>Row 1:
nosql> {
nosql> "_id":"Tolkien, J.R",
nosql> "avgPrice":15.5
nosql> }
nosql>Row 2:
nosql> {
nosql> "_id":"Verne, Jules",
nosql> "avgPrice":6.35
nosql> }
nosql>2 rows returned

您可以在$ project任务中应用算术,字符串或日期时间运算。 以下示例使用$ divide运算符为每个作者计算$ group任务中的总和和平均值后,计算每页的价格,如清单26所示。

清单26.列表作者和每页价格升序排序(格式化)
nosql>db.books.aggregate({$group: {"_id": {author:1},  "sumSales":{"$sum": "$sales"}, avgPages: {"$avg": "$pages"},  avgPrice: {"$avg": "$price"} }},{$project: {author: "$_id.author", sumSales: 1, pricePerPage:  {$divide: ["$avgPages", "$avgPrice"]}}},{$sort: {pricePerPage: 1}})

提示:在函数中引用实际或计算的属性名称时,请确保在此类属性名称前加$并用双引号引起来,例如$ divide操作的“ $ avgPrice”。

聚合函数可以包含单个或多个任务,并且不需要包含$ group任务。 例如,您可以将aggregate()用于简单的投影任务,无论是否修改值,如清单27所示。

清单27.选择属性的子字符串
nosql>db.books.aggregate({"$project": {author:1, title:1, shortabs: {"$substr": ["$abstract",0,10]} } })

聚合任务仅允许通过包含来指定字段。 如果通过投影或分组步骤在某个步骤中明确选择了属性,则可以在下一步中使用属性,并在上一步中分配参考名称。 其他所有字段均被丢弃。

提示: aggregate()函数仅返回指定的属性。 与find()函数不同,它不会自动将生成的_id包含在$ project任务中。

提示:在以后的任务中引用计算或重命名的字段之前,请确保已对其进行投影。

有效任务如表3所示。

表3.聚合任务
任务 描述
$组 应用求和或平均等合计运算; 需要根据一个或多个属性构建的组密钥
$ limit 限制应退回的文件数
$ match 使用查询条件选择文档的子集
$项目 从文档中选择字段并(可选)分配参考名称
$跳过 使用偏移量进行分页
$ sort 排序给定属性的输出(升序1,降序-1)

表4列出了支持的聚合操作的列表。 有关详细用法,请参阅DB2 JSON参考文档。

表4.聚合操作
数据类型 操作方式
$字符串 $ concat,$ max,$ min,$ substr,$ toLower,$ toUpper
$ date,$ timestamp $ year,$ month,$ week,$ hour,$ minute,$ second,$ dayOfYear,$ dayOfMonth,$ dayOfWeek
$ int,$ number $ add,$ divide,$ multiply,$ subtract,$ mod,$ min,$ max,$ avg,$ sum,$ inc

提示:如果收到错误消息,指出不支持特定的运算符,请检查语法并确保序列为{operator:{field:value}},例如{{$ gt“:{rating:1}}。

更新文件

update()函数更新一个或多个文档中的数据。 它支持几个可选参数来确定更新范围。 用法是update(<condition>, <fields to update>, <upsertFlag>, <multiRowFlag>)

警告:指定新的字段值时,如果只想更新文档中的指定字段而其他字段保持不变,请确保使用$set运算符。 没有此运算符,文档内容将被指定的字段替换,如清单28和29所示。

清单28.使用$ set运算符使用指定的isbn更新文档
nosql>db.books.find({isbn: "123-456-234"}, {_id:0, isbn:1, author:1, title:1, pages:1})
Row 1:
{"isbn":"123-456-234","author": "Verne, Jules","title":"Journey to the Center of the Earth","pages":276}nosql>db.books.update({isbn: "123-456-234"}, {$set: {pages: 299}})
Updated 1 rows.nosql>db.books.find({isbn: "123-456-234"}, {_id:0, isbn:1, author:1, title:1, pages:1})
Row 1:
{"isbn":"123-456-234","author": "Verne, Jules","title":"Journey to the Center of the Earth","pages":299}
清单29.不使用$ set运算符更新文档
db.books.update({isbn: "123-456-234"}, {isbn: "123-456-234" , price: 6.50})
Updated 1 rows.nosql>db.books.find({isbn: "123-456-234"}, {_id:0, isbn:1, author:1, title:1, price:1})Row 1: {"_id":{"$oid":"519e2bfb37a817b9cba77ab0"},"isbn":"123-456-234","author": null,"title": null,"price":6.50}

确定更新范围的其他选项是upsert和multiRow标志。 upsert标志允许指定是否应插入或拒绝丢失的文档,即,该标志指示如果集合中没有与指定标识符匹配的内容,系统应采取的措施:

  • 如果upsert标志设置为true,则将插入丢失的文档。
  • 如果该标志设置为false,则更新将被拒绝。

使用multi-row标志,您还可以确定是否只将更新应用于符合搜索条件的第一个文档,还是应用于所有此类匹配的文档,如清单30所示。

清单30.用于更新文档的选项的示例
Do not insert if no matching document exists,
update the first document that matches the query:nosql>db.books.update({author: "Climber, Joe"}, {$set: {price: 9.99}}, false, false)Do not insert if no matching document exists, update all documents that match the query:nosql>db.books.update({author: "Climber, Joe"}, {$set: {price: 9.99}}, false, true)

save()方法结合了插入和更新功能,但依赖于文档标识符来确定范围。 如果文档包含_id ,则将对文档进行升级。 如果文档不包含_id ,则将生成一个新的标识符并插入文档。

在下面的示例中,书籍文档不包含_id ,因此将生成一个新的标识符,并将新书籍插入books集合中,如清单31所示。

清单31.保存一个文档
nosql>db.books.save({isbn: "123-456-239", "author": "Verne, Jules",  "title": "Mysterious Island" })"

使用索引

如果在查询中经常将属性用作选择或排序条件,则创建索引对于加快较大数据工作量的检索时间很有用。 可以在单个或多个属性上创建JSON属性的索引。 如果未指定索引名称,则将分配默认名称。

注:对于Linux,Unix和Windows上的DB2,可以按升序和降序对索引进行排序,并且支持对数组中的元素进行索引。 使用DB2 for z / OS,索引只能以升序排列,并且不支持阵列上的索引。

要创建索引,请使用ensureIndex()命令,如清单32所示。

清单32.创建索引
Create an index on field 'author' in ascending order, using the default type string with default length 50:nosql>db.books.ensureIndex({"author": 1})
Index <books_xauthor> was created successfully.Create an index on field 'category' with type string and field length 40:nosql>db.books.ensureIndex({"category": [1, "$string", 40]})
Index <books_xcategory> was created successfully.Create an index on field price with type number in descending order, name it 'mypriceidx':nosql>db.books.ensureIndex({"price": [-1, "$number"]}, “mypriceidx”)
Index <mypriceidx> was created successfully.

您可以使用getIndexes()命令查看该集合的索引列表。 注意,在_id属性上会自动创建一个唯一索引,如清单33所示。

清单33.索引信息,包括标识符的索引(格式化的输出)
nosql>db.books.getIndexes()[{"v":0,"key":{"_id_":1},"ns":"TEST.books","name":"_id_","unique":true},
{"v":1,"key":{"author":1},"ns":"TEST.books","name":"books_xauthor","unique":false},
{"v":2,"key":{"category":1},"ns":"TEST.books","name":"books_xcategory","unique":false},
{"v":3,"key":{"price":1},"ns":"TEST.books","name":"mypriceidx","unique":false}]

使用unique标志在属性上创建唯一索引。 系统将尝试创建唯一索引。 如果该集合已经包含文档,则必须确保在指定的字段中没有重复的数据,如清单34所示。

清单34.错误案例:在重复数据上创建唯一索引
nosql>db.books.ensureIndex({"isbn": [1, "$string", 30]}, "myisbnix", true)nosql> Error:[nosql][1.0.66] Failed to create index. ;Caused by: A unique index cannot be created because the table contains data that would result in duplicate index entries.. SQLCODE=-603, SQLSTATE=23515, DRIVER=3.66.33

要查找重复的条目,聚合查询很方便,如清单35所示。

清单35.查找重复数据的示例(格式化的)
nosql>db.books.aggregate({"$group": {_id: "isbn", countdocs: {"$sum": 1}}}, {"$project": {"grouped_isbn": "_id", "countdocs": 1}}, {"$match": {"countdocs": {$gt: 1}}})

嵌套对象

例如,文档还可以包含嵌套的对象,而不是包含作者信息的单个字符串,而是可以在名字和姓氏之间进行分隔,如清单36所示。另请参见“下载”部分中的books_importNested.js。

清单36.带有嵌套对象的文档
{isbn: "123-456-234", author: {lastname: "Verne", firstname: "Jules"}, title: "Journey to the Center of the Earth", sales: 333.0})

文档中的每个元素都必须是唯一可识别的。 例如,元素“ title”只能出现一次,如元素“ author.lastname”一样,如清单37所示。但是,如果属性名称位于不同的路径中,则名称可以相同。 因此,只要它在文档中具有单独的绝对路径,就可以使用另一个名为“ lastname”的属性,例如“ editor.lastname”。

清单37.导入和搜索具有嵌套属性的文档
nosql>db.booksnest.importFile(“books_importNested.js”)nosql>db.booksnest.findOne()
{"_id":{"$oid":"51b7a63d3503e8eca2e84556"},"isbn":"122-456-789","author":{"lastname":"Tolkien","firstname":"J.R"},"title":"The Hobbit","abstract":"Spiders and Dragons","category:["Fantasy", "Fiction"],"price":5.0,"pages":216,"sales":800.8}

要查询嵌套对象,请使用点符号指定所需属性的完整路径。 例如,要搜索作者的姓氏,请使用“ author.lastname”,如清单38所示。

清单38.对嵌套对象的查询
nosql>db.booksnest.find({"author.lastname": "Verne"})

提醒:确保将字段名称括在双引号中。

数组

文档也可能包含数组形式的对象的多次出现。 例如,一个用户可能有多个电话号码或电子邮件地址,或者一本书可能属于多个类别,或者可能有多个作者,如清单39所示。

清单39.使用数组列出多个类别(格式化的)
nosql>db.booksnest.insert({isbn: "876-543-321", author: {lastname: "Doe", firstname: "John" },title: "A new book", abstract: "The most curious items", pages: 111,category: ["Humor", "YA"]})

在不指定数组位置的情况下搜索属性时,将在所有位置搜索该值,如清单40所示。

清单40.数组中的搜索值
nosql>db.booksnest.find({category: "Humor"})nosql>Row 1:
nosql> {
nosql> "_id":{"$oid":"51a293e437a81d6b7f8c1971"},
nosql> "isbn":"876-543-321",
nosql> "author{lastname: "Doe", firstname: "John"},
nosql> "title":"A new book",
nosql> "abstract":"The most curious items",
nosql> "pages":111,
nosql> "category":["Humor", "YA"]
nosql> }

但是,您也可以通过将数组位置添加到点符号的属性中来搜索特定位置,如清单41所示。

清单41.在特定数组位置搜索数组值
nosql>db.booksnest.find({"category.0": "Humor"})
nosql>Row 1:
nosql> {
nosql> "_id":{"$oid":"51a293e437a81d6b7f8c1971"},
nosql> "isbn":"876-543-321",
nosql> "author{lastname: "Doe", firstname: "John"},
nosql> "title":"A new book",
nosql> "abstract":"The most curious items",
nosql> "pages":111,
nosql> "category":["Humor", "YA"]
nosql> }
nosql>1 row returned nosql>db.booksnest.find({"category.1": "Humor"})
nosql>0 rows returned

提示:请注意,第一个位置的计数从0开始。

请参阅有关使用数组的DB2 JSON参考文档,以获取有关数组中数据的命令和功能限制的最新详细信息。

行政

处理收藏

要列出当前JSON名称空间中的所有集合名称,请使用getCollectionNames()命令。 在此示例中,当前的JSON名称空间中存在三个集合,如清单42所示。

清单42.显示当前集合
nosql>db.getCollectionNames()
[media, books, booksnest]

例如,要重命名集合,以继续使用集合但归档现有内容,请使用rename()命令指定一个新名称,如清单43所示。

清单43.重命名现有集合
nosql>db.books.rename(“oldbooks”)

如果已经存在使用新名称的集合,则该命令将失败。 但是,您可以通过指定一个标志来强制删除现有目标集合,从而强制重命名该集合。 在示例中,如果已经存在名称为“ oldbooks”的集合,则命令db.books.rename(“oldbooks”, true)将首先删除集合“ oldbooks”,然后将集合“ books”重命名为“ oldbooks” 。

统计

stats()命令返回有关集合的信息,特别是名称空间,文档数和索引列表。 该统计信息还包括有关文档平均大小和集合总大小的信息,如清单44所示。此信息从DB2统计信息中填充,并且可能会延迟刷新。 不可用的值设置为-1。

清单44.获取集合统计信息(修剪输出)
nosql>db.books.stats(){"ns":"TEST.books","count":15,"size":4.5263671875,"avgObjSize":309.0,"numExtents":-1,"nindexes":2,"totalIndexSizes":-1,"indexSizes":[{"books_xauthor": -1},{"_id_":-1}],"ok":1}

删除数据,索引和集合

要从集合中删除一个文档或多个文档,请使用remove()函数。 您可以删除所有文档(将保留索引定义),也可以通过指定条件删除一部分文档,如清单45所示。

清单45.删除一个文档
nosql>db.books.remove({isbn: "123-456-789"})

如果不再需要索引,或者您要重新创建具有不同索引特征的索引,则可以通过引用索引名称或通过指定用于创建索引的索引特征(如果没有索引名称来删除索引)来删除索引。显式分配),如清单46所示。

清单46.删除索引
nosql>db.books.removeIndex("mypriceidx")
Index <mypriceidx> was removed successfully.nosql>db.books.removeIndex({"author": 1})
Index <books_xauthor> was removed successfully.

要从集合中删除所有数据但保留空集合和任何索引,请使用remove()命令,如清单47所示。

清单47.删除一个集合
nosql>db.books.remove()
OK
nosql>db.books.getIndexes()
[{"v":0,"key":{"_id_":1},"ns":"TEST.books","name":"_id_","unique":true},
{"v":1,"key":{"pages":1},"ns":"TEST .books","name":"books_xpages","unique":false},
{"v":2,"key":{"isbn":1},"ns":"TEST .books","name":"myisbnix","unique":true}]

要删除集合和所有索引,请在集合上使用drop()命令,如清单48所示。

清单48.删除一个集合
nosql>db.books.drop()
OK
nosql>db.books.getIndexes()
[]

清理

要删除特定JSON命名空间的所有集合,可以使用命令dropAllCollections() ,如清单49所示。如果此JSON命名空间包含用户没有必要的放置特权的集合,则将针对该错误信息打印一条错误消息。任何此类收藏。

清单49.将所有集合放在JSON名称空间中
nosql>db.dropAllCollections()

为了强行删除集合并删除JSON系统目录,请使用值为truedisable()命令,如清单50所示。与dropAllCollections()命令一样,需要足够的特权才能删除所有受影响的对象。

清单50.禁用JSON功能
nosql>disable(true)

如果disable()命令与false选项一起使用,则将打印DDL语句,但不会执行。

结论

本文指导您完成DB2 JSON命令行环境的设置,并介绍了一些基本命令来与集合一起使用来存储和查询JSON文档。 要了解有关DB2 JSON的更多信息,请参见如何使用Java API或如何使用有线侦听器来接收和处理请求,请参阅本系列的其他文章。 有关命令和操作的详细信息,请参阅DB2 JSON参考文档。


翻译自: https://www.ibm.com/developerworks/data/library/techarticle/dm-1306nosqlforjson2/index.html

命令行处理器命令

命令行处理器命令_使用命令行处理器相关推荐

  1. linux命令行发送串口_从命令行在Linux中发送电子邮件

    linux命令行发送串口 In this article, you will learn how to send emails using the popular mail commands. It' ...

  2. mac 命令行打开火狐_从命令行打开多个Firefox选项卡

    mac 命令行打开火狐 Now that I work on Firefox Developer Tools, I'm really starting to learn some of the tri ...

  3. 命令回复mysql数据库_用命令行恢复MySQL数据库

    今天在恢复一个数据库的时候着实是让我郁闷死了,我用的是图形界面(MySQL Administraotr),备份文件不过8M左右,恢复了将近40分钟,慢得像牛一样(我机器配置Core 2+2G内存).总 ...

  4. 使用mysql命令行的工具_[MySQL]命令行工具和基本操作

    一 MySQL命令行工具  (查看帮助 ---help,或 -?) 1)MySQL MySQL是一个简单的SQL外壳(有GNUreadline功能).它支持交互式和非交互式使用.当交互使用时,查询结果 ...

  5. python命令行运行模式_[Python] 命令行模式阅读博客园的博文

    1 #-*- coding:UTF-8 -*- 2 importrequests3 from lxml importetree4 importsys5 importio6 importos7 8 9 ...

  6. xdpyinfo命令找不到_无法使用命令 /usr/bin/xdpyinfo 自动检查显示器颜色。

    在笔记本上安装了虚拟机,又在该虚拟机中安装oracle11g.我在使用xshell5中,用oracle账户登录,执行./runInstaller时,发出如下错误: >>> 无法使用命 ...

  7. xdpyinfo命令找不到_无法使用命令 /usr/bin/xdpyinfo 自动检查显示器颜色。请检查是否设置了 DISPLAY 变量。 未通过...

    无法使用命令 /usr/bin/xdpyinfo 自动检查显示器颜色.请检查是否设置了 DISPLAY 变量. 未通过 <<<< 安装Oracle 11G 执行报错,这是怎么解 ...

  8. 简单20行python代码_用 20 行 python 代码实现人脸识别!Python实现就是这么简单!...

    今天给大家介绍一个世界上最简洁的人脸识别库 face_recognition,你可以使用 Python 和命令行工具进行提取.识别.操作人脸. 基于业内领先的 C++ 开源库 dlib 中的深度学习模 ...

  9. php中调行高代码_单元格行高怎么设置

    单元格行高怎么设置? 如图一张表,全选,全选的快捷键是Ctrl+A.全选之后第一种方法是直接用鼠标放到最前面的竖栏上,放在数据与数据之间交叉的框上,会出现一个+字的符号. 这个时候点击鼠标左键拉动,就 ...

  10. python50行小游戏_使用50行Python代码从零开始实现一个AI平衡小游戏

    集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何用 50 行 Python 代码创建一个 AI,使用增强学习技术,玩耍一个保持杆子平衡的小游戏.所用环境为标准的 OpenAI Gym, ...

最新文章

  1. C#以post方式调用struts rest-plugin service的问题
  2. SQL Server 找回没有备份的数据
  3. 后台获取html控件的值
  4. B10_NumPy数组操作、修改数组形状、翻转数组、修改数组维度、连接数组、分割数组、数组元素的添加与删除
  5. BNUOJ 4215 最长公共连续子序列
  6. r语言用行名称提取数据框信息显示na_学会这些R语言技巧至少可以节省半年时间...
  7. 【Java】GUI桌面弹球游戏
  8. 《极品飞车12》官方网站公布发售日
  9. 如何估算代码量_千万级用户的大型网站,应该如何设计其高并发架构?(彩蛋)...
  10. EM算法极其推广---EM算法的收敛性
  11. 华为机试HJ40:统计字符
  12. 百度图神经网络学习——day04:图神经网络算法(二)
  13. CVPR 2018:阿里提出新零样本学习方法,有效解决偏置问题
  14. LinQ To XML——用LinQ查询XML
  15. 天思经理人ERP塑胶玩具行业应用方案
  16. 证明连续随机变量形式Jensen不等式
  17. android 用gridview,Android GridView的使用
  18. AURIX TC397 ASCLIN UART
  19. 被问:这个BUG为什么没测出来?该如何回答
  20. CentOS7.9 离线安装FTP服务器

热门文章

  1. python爬虫淘宝图片+GUI+打包成exe
  2. Android中获取手机 IMEI Mac地址 IP地址
  3. flask_jsonify 中文乱码(unicode)
  4. 关于MindManager 思维导图2018 中文版介绍
  5. python qsub是啥意思_python – 使用qsub提交连续和独立作业的速度有多快?
  6. RS-232与RS-422及RS-485
  7. Mastering_Rust(译):宏(第八章)(完+1)
  8. Guerrilla Oracle: The Succinct Windows Perspective
  9. 欧几里得扩展算法(动态规划实现)
  10. 教你给视频画面任意位置插入GIF图