当前位置: 首页 > news >正文

数据库实战篇,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 说明文档

相关文章:

  • SQL注入之时间盲注攻击流程详解
  • SLAM文献之DM-VIO: Delayed Marginalization Visual-Inertial Odometry
  • 大模型之Hugging Face
  • 信奥还能考吗?未来三年科技特长生政策变化
  • 【开发教程】学生团队项目开发协调管理文档库构建以及使用指南
  • #4 为什么要物联以及 物联网的整体结构
  • linux tracepoint系列宏定义(TRACE_EVENT,DEFINE_TRACE等)展开过程分析之三 define_trace.h头文件
  • 【blender小技巧】Blender导出带贴图的FBX模型,并在unity中提取材质模型使用
  • telepresence使用指南
  • 【LH-开发记录】
  • Dockerfile 学习指南和简单实战
  • 一文介绍关于多模态的基础知识 !!
  • PHP弱类型hash比较缺陷
  • 高速连接器设计的技术挑战和解决方案
  • Dify智能体平台源码二次开发笔记(5) - 多租户的SAAS版实现(2)
  • 添加登录和注册功能
  • 图像预处理(OpenCV)-part2
  • 3.6 函数图像描绘
  • 3.6 集合
  • SpringBoot Starter自定义:创建可复用的自动配置模块
  • 海南高院通报去年知产领域司法保护状况:审结民事一审案件4847起
  • 舞剧《百合花》7月绽放,王安忆:这是送给母亲的一份礼物
  • 洛阳白马寺存争议的狄仁杰墓挂牌,当地文物部门:已确认
  • 广西三江通报“网约车司机加价”:对网约车平台进行约谈
  • 话剧《门第》将开启全国巡演:聚焦牺牲、爱与付出
  • 上海黄金交易所:贵金属价格波动剧烈,提示投资者做好风险防范