将 MongoDB 查询转换为 Snowflake
Convert MongoDB query to Snowflake
我正在做一个迁移项目(MongoDB 到 Snowflake)并尝试将 mongo 查询之一转换为 Snowflake,我们有一个用例来获取记录,如果所有根据给定参数匹配的数组中的元素。
Mongo DB Function: $all
The $all operator selects the documents where
the value of a field is an array that contains all the specified
elements.
Mongo 查询:
db.collection('collection_name').find({
'code': { '$in': [ 'C0001' ] },
'months': { '$all': [ 6, 7, 8, 9 ] } --> 6,7,8,9 given parameters
});
Table Structure in snowflake:
column name datatype
code varchar(50)
id int
months ARRAY
weeks ARRAY
您能否就如何在 Snowflake 中编写此查询提供一些建议?
任何建议都会有所帮助。
您可以使用ARRAY_SIZE和ARRAY_INTERSECTION来测试它:
这是示例 table:
create or replace table test ( code varchar, months array );
insert into test select 'C0002', array_construct( 1, 2, 5,8,6,3)
union all select 'C0001', array_construct( 1,2,3 )
union all select 'C0002', array_construct( 2, 12, 3,7,9)
union all select 'C0001', array_construct( 7,8,9,3, 2) ;
这里是要测试的查询:
select * from test where code in ('C0001','C0002')
and ARRAY_SIZE( ARRAY_INTERSECTION( months, array_construct( 3, 2 ))) = 2;
所以我找到两个数组的交集,并检查项目数。如果你想查找 3 个项目,你应该设置 3(它是这样的):
select * from test where code in ('C0001','C0002')
and ARRAY_SIZE( ARRAY_INTERSECTION( months, array_construct( 3, 2, 7 ))) = 3;
我正在做一个迁移项目(MongoDB 到 Snowflake)并尝试将 mongo 查询之一转换为 Snowflake,我们有一个用例来获取记录,如果所有根据给定参数匹配的数组中的元素。
Mongo DB Function: $all
The $all operator selects the documents where the value of a field is an array that contains all the specified elements.
Mongo 查询:
db.collection('collection_name').find({
'code': { '$in': [ 'C0001' ] },
'months': { '$all': [ 6, 7, 8, 9 ] } --> 6,7,8,9 given parameters
});
Table Structure in snowflake:
column name datatype
code varchar(50)
id int
months ARRAY
weeks ARRAY
您能否就如何在 Snowflake 中编写此查询提供一些建议? 任何建议都会有所帮助。
您可以使用ARRAY_SIZE和ARRAY_INTERSECTION来测试它:
这是示例 table:
create or replace table test ( code varchar, months array );
insert into test select 'C0002', array_construct( 1, 2, 5,8,6,3)
union all select 'C0001', array_construct( 1,2,3 )
union all select 'C0002', array_construct( 2, 12, 3,7,9)
union all select 'C0001', array_construct( 7,8,9,3, 2) ;
这里是要测试的查询:
select * from test where code in ('C0001','C0002')
and ARRAY_SIZE( ARRAY_INTERSECTION( months, array_construct( 3, 2 ))) = 2;
所以我找到两个数组的交集,并检查项目数。如果你想查找 3 个项目,你应该设置 3(它是这样的):
select * from test where code in ('C0001','C0002')
and ARRAY_SIZE( ARRAY_INTERSECTION( months, array_construct( 3, 2, 7 ))) = 3;