数据库实战篇,JSON对象在Kooboo中的实际应用(二)
在 Kooboo 开发环境中,使用 JSON 对象进行数据库查询是一种强大且便捷的方式。通过 find
和 findAll
方法,开发者能够直接以 JSON 对象作为查询条件,避免了手动拼接 SQL 语句的繁琐和易错性。以下将对这种查询方式的用法、常见问题及解决办法进行详细阐述。
一、动态创建表:插入数据
- 具体如何在 Kooboo 中创建表可看上篇内容:
数据库实战篇,SQL在Kooboo中的实际应用(一)
https://blog.csdn.net/2501_91137919/article/details/147150844?fromshare=blogdetail&sharetype=blogdetail&sharerId=147150844&sharerefer=PC&sharesource=2501_91137919&sharefrom=from_link
// 1. 定义数据对象
var obj = {}
obj.id = '1'; // 主键(若不指定,系统自动生成Guid)
obj.id = '2';
obj.name = '张三';
obj.name = '王五';
obj.phone = '10086';
obj.age = '25',
obj.age = '28'
k.DB.sqlite.user.add(obj); // 自动创建表及字段
-
数据表结构
二、基础语法对比
1. find
方法
- 作用:该方法用于返回第一条匹配的记录。当我们只需要获取符合特定条件的第一条数据时,就可以使用
find
方法。
2. findAll
方法
- 作用:
findAll
方法用于返回所有匹配的记录。如果我们需要获取所有符合条件的数据集合,就可以使用这个方法。
三、正确使用 JSON 对象查询
1. 单条件查询(精确匹配)
示例代码:
// 查询 phone = "10086" 的所有用户
var users = k.DB.sqlite.user.findAll({
phone: "10086" // 直接键值对匹配
});
- 解释:这里通过
findAll
方法,使用一个简单的 JSON 对象{phone: "10086"}
作为查询条件,能够精确匹配user
表中phone
字段值为"10086"
的所有记录。这种方式简洁明了,适用于只需要根据一个字段的精确值进行查询的场景。
2. 多条件组合(AND 逻辑)
示例代码:
// 查询 phone = "10086" 且 age >= 20 的用户
const { GTE } = k.DB.sqlite.operators(); // 引入运算符
var users = k.DB.sqlite.user.findAll({
phone: "10086",
age: { [GTE]: 20 } // 使用运算符
});
k.response.write(users);
- 解释:在实际查询中,我们常常需要根据多个条件来筛选数据。这里通过
operators
方法引入了GTE
(大于等于)运算符。在 JSON 对象中,我们可以同时指定多个条件,这些条件之间默认是AND
逻辑关系。即查询结果中的记录需要同时满足phone
字段值为"10086"
且age
字段值大于等于 20。
3. 或逻辑(OR 条件)
示例代码:
// 查询 phone = "10086" 或 name = "张三" 的用户
const { OR, EQ } = k.DB.sqlite.operators();
var users = k.DB.sqlite.user.findAll({
[OR]: [
{ phone: { [EQ]: "10086" } },
{ name: { [EQ]: "张三" } }
]
});
- 解释:当我们需要查询满足多个条件中任意一个条件的记录时,就可以使用
OR
逻辑。通过operators
方法引入OR
和EQ
(等于)运算符,在 JSON 对象中使用[OR]
数组来包含多个条件对象。查询结果会包含phone
字段值为"10086"
或者name
字段值为"张三"
的所有记录。
4. 复杂嵌套与组合条件查询
JSON 查询可以使用的语法包含:EQ
(等于)、AND
(与)、GT
(大于)、GTE
(大于等于)、LT
(小于)、LTE
(小于等于)、OR
(或)、CONTAINS
(包含)。这些条件不仅可以单独使用,还能进行嵌套与组合,以满足多样化的查询需求。其中,AND
逻辑是默认的条件组合方式,但也可通过 OR
明确指定 “或” 关系。
以下是一些示例,展示了如何使用这些语法进行更复杂的 JSON 查询:
// 示例 1:单条件精确匹配查询
// 查找 name 为 "张三" 的第一条记录
var MatchName = k.DB.sqlite.user.find({name: "张三"});
// 示例 2:多条件默认 AND 逻辑查询
// 查找 name 为 "张三" 且 age 为 "25" 的第一条记录
var MatchAnd = k.DB.sqlite.user.find({name: "张三", age: "25"});
// 示例 3:嵌套 OR 逻辑查询
// 引入操作符
const { EQ, OR } = k.DB.indexedDb.operators();
// 查找 name 为 "张三" 或者 age 为 "28" 的第一条记录
var MatchNested = k.DB.sqlite.user.find({
[OR]: [
{ name: { [EQ]: "张三" } },
{ age: { [EQ]: "28" } }
]
});
// 输出单条件查询结果
k.response.write(MatchNested);
解释
- 单条件精确匹配查询:在
MatchName
示例中,通过简单的键值对{name: "张三"}
实现了对name
字段的精确匹配查询,会返回user
表中name
为"张三"
的第一条记录。 - 多条件默认 AND 逻辑查询:
MatchAnd
示例中,在 JSON 对象里同时指定了name
和age
两个条件,由于AND
是默认逻辑,因此会查找同时满足这两个条件的第一条记录。 - 嵌套 OR 逻辑查询:引入
EQ
和OR
操作符,使用[OR]
数组包裹多个条件对象,查找name
为"张三"
或者age
为"28"
的第一条记录。
四、常见问题与解决
1. 为什么查询结果为空?
- 字段名大小写敏感:在 Kooboo 中,JSON 对象的键名与数据库字段名是大小写敏感的。例如,
phone
和Phone
会被视为不同的字段。所以在编写查询条件时,一定要确保 JSON 键名与数据库字段名完全一致。 - 未提交数据:当我们插入数据后,如果没有调用
k.response.write()
方法,数据实际上并没有真正保存到数据库中。因此在插入数据后,需要及时调用该方法,以确保数据能够被正确查询到。 - 数据类型不匹配:数据库中的字段有其特定的数据类型,在查询时需要注意数据类型的匹配。
2. 如何查询空值?
示例代码:
// 查询 email 字段为空的用户
var users = k.DB.sqlite.user.findAll({
email: null // 直接赋值为 null
});
- 解释:要查询某个字段为空的记录,只需在 JSON 对象中直接将该字段的值设为
null
即可。这样就能筛选出email
字段为空的所有记录。
3. 模糊查询(LIKE)示例代码:
// 查询 name 包含 "张" 的用户
const { CONTAINS } = k.DB.sqlite.operators();
var users = k.DB.sqlite.user.findAll({
name: { [CONTAINS]: "张" } // 类似 SQL 的 %张%
});
- 解释:在 SQL 中,我们可以使用
LIKE
关键字进行模糊查询。在 Kooboo 中,通过operators
方法引入CONTAINS
运算符,就可以实现类似的模糊查询功能。这里的查询结果会包含name
字段中包含"张"
的所有记录,类似于 SQL 中的%张%
条件 -
五、操作符全表
操作符 | 含义 | 示例 |
---|---|---|
EQ | 等于 | {age: { [EQ]: 25 }} ,用于查询 age 字段值等于 25 的记录。 |
GT | 大于 | {age: { [GT]: 20 }} ,用于查询 age 字段值大于 20 的记录。 |
GTE | 大于等于 | {age: { [GTE]: 18 }} ,用于查询 age 字段值大于等于 18 的记录。 |
LT | 小于 | {age: { [LT]: 30 }} ,用于查询 age 字段值小于 30 的记录。 |
LTE | 小于等于 | {age: { [LTE]: 60 }} ,用于查询 age 字段值小于等于 60 的记录。 |
CONTAINS | 包含(字符串模糊匹配) | {name: { [CONTAINS]: "张" }} ,用于查询 name 字段包含 "张" 的记录。 |
OR | 或逻辑 | { [OR]: [条件1, 条件2] } ,用于查询满足条件 1 或者条件 2 的记录。 |
AND | 与逻辑(默认) | 在 JSON 对象中同时指定多个条件时,默认是 AND 逻辑关系,无需显式声明。 |
六、实际场景示例
场景:筛选 VIP 用户
示例代码:
const { GTE, CONTAINS } = k.DB.sqlite.operators();
var vipUsers = k.DB.sqlite.user.findAll({
[AND]: [
{ level: { [GTE]: 3 } }, // 等级 ≥ 3
{ tags: { [CONTAINS]: "VIP" } }, // 标签包含 VIP
{ isActive: true } // 状态为激活
]
});
- 解释:在实际开发中,我们常常需要根据多个条件来筛选特定的数据集合。在这个场景中,我们要筛选出 VIP 用户,需要满足三个条件:用户等级大于等于 3、用户标签包含
"VIP"
且用户状态为激活。通过使用AND
逻辑和相应的运算符,我们可以方便地实现这个查询需求。
总结
1. 直接键值对查询
findAll({phone: "10086"})
这种直接使用键值对的查询方式是合法且高效的,适用于简单的精确匹配查询场景。
2. 灵活运算符
通过 k.DB.sqlite.operators()
方法,我们可以调用各种高级条件运算符,实现范围查询、模糊匹配等复杂的查询需求,大大增强了查询的灵活性。
3. 注意一致性
在使用 JSON 对象进行查询时,一定要注意字段名大小写和数据类型与数据库的完全匹配,避免因这些细节问题导致查询结果不符合预期。
通过掌握 Kooboo 中 JSON 对象查询的方法和技巧,开发者能够更加高效地进行数据库查询操作,提升开发效率和代码质量,详细了解Kooboo应用:Kooboo 说明文档