Loopback 4:如何查询对象数组
Loopback 4: How to query an array of objects
我无法根据对象数组中的 属性 查询对象。
我正在尝试查询具有 ID 7 事件的所有订单:
const orders = await this.orderRepository.find({where: {events: {elemMatch: {'id': event.id}}}});
以上给出了以下错误:
ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''{\"id\":\"7\"}
如果我尝试以下过滤器,我总是得到一个空数组:
{where: {events: {like: '%id%'}}}
Loopback 4 的正确方法是什么?
更新:
我正在使用 MySQL 8.0.
这是我的订单模型中事件的定义:
@property({
type: 'array',
itemType: 'object',
required: false,
})
events: CartItem[] | null;
解决方案
由于您正在使用 MySQL
环回连接器连接到您的 MySQL
数据库,目前此连接器将 String/JSON
视为 VARCHAR
。因此,您可以尝试以下修改来喜欢
{where: {events: {like: '%id:'+7+'%'}}}
或
const orders = await this.orderRepository.find({
where: {
events: {
like: '%id:'+event.id+'%'
}
}
});
或使用正则表达式
const orders = await this.orderRepository.find({
where: {
events: {
regexp: '.*id:'+event.id+'.*'
}
}
});
const orders = await this.orderRepository.find({
where: {
events: {
regexp: new RegExp(".*id:"+event.id+".*")
}
}
});
尝试匹配 json
模式 {
id:7,name:'Event 7'}
其中 [=29 中的值=] 可以是 7
.
假设
根据您的问题和显示的 mysql 错误,做出以下假设:
架构(MySQL v5.7)
create table samples(id int primary key auto_increment, events varchar(400));
insert into samples(events) values
('[{id:3,name:\"Boscobel\"},{id:4,name:\"Rays\"}]'),
('[{id:7,name:\"Boscobel 7\"},{id:8,name:\"Rays 8\"}]');
应该收到结果
查询#1
select * from samples where events like '%id\:7%';
| id | events |
| --- | ----------------------------------------------- |
| 2 | [{id:7,name:"Boscobel 7"},{id:8,name:"Rays 8"}] |
查询#2
select * from samples where events like '%id:7%';
| id | events |
| --- | ----------------------------------------------- |
| 2 | [{id:7,name:"Boscobel 7"},{id:8,name:"Rays 8"}] |
不应收到结果
查询#3
select * from samples where events like '%id\:70%';
没有要显示的结果。
查询#4
select * from samples where events like '%id:200%';
没有要显示的结果。
我无法根据对象数组中的 属性 查询对象。
我正在尝试查询具有 ID 7 事件的所有订单:
const orders = await this.orderRepository.find({where: {events: {elemMatch: {'id': event.id}}}});
以上给出了以下错误:
ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''{\"id\":\"7\"}
如果我尝试以下过滤器,我总是得到一个空数组:
{where: {events: {like: '%id%'}}}
Loopback 4 的正确方法是什么?
更新:
我正在使用 MySQL 8.0.
这是我的订单模型中事件的定义:
@property({
type: 'array',
itemType: 'object',
required: false,
})
events: CartItem[] | null;
解决方案
由于您正在使用 MySQL
环回连接器连接到您的 MySQL
数据库,目前此连接器将 String/JSON
视为 VARCHAR
。因此,您可以尝试以下修改来喜欢
{where: {events: {like: '%id:'+7+'%'}}}
或
const orders = await this.orderRepository.find({
where: {
events: {
like: '%id:'+event.id+'%'
}
}
});
或使用正则表达式
const orders = await this.orderRepository.find({
where: {
events: {
regexp: '.*id:'+event.id+'.*'
}
}
});
const orders = await this.orderRepository.find({
where: {
events: {
regexp: new RegExp(".*id:"+event.id+".*")
}
}
});
尝试匹配 json
模式 {
id:7,name:'Event 7'}
其中 [=29 中的值=] 可以是 7
.
假设
根据您的问题和显示的 mysql 错误,做出以下假设:
架构(MySQL v5.7)
create table samples(id int primary key auto_increment, events varchar(400));
insert into samples(events) values
('[{id:3,name:\"Boscobel\"},{id:4,name:\"Rays\"}]'),
('[{id:7,name:\"Boscobel 7\"},{id:8,name:\"Rays 8\"}]');
应该收到结果
查询#1
select * from samples where events like '%id\:7%';
| id | events |
| --- | ----------------------------------------------- |
| 2 | [{id:7,name:"Boscobel 7"},{id:8,name:"Rays 8"}] |
查询#2
select * from samples where events like '%id:7%';
| id | events |
| --- | ----------------------------------------------- |
| 2 | [{id:7,name:"Boscobel 7"},{id:8,name:"Rays 8"}] |
不应收到结果
查询#3
select * from samples where events like '%id\:70%';
没有要显示的结果。
查询#4
select * from samples where events like '%id:200%';
没有要显示的结果。