将 MongoDB 查询转换为雪花

Posted

技术标签:

【中文标题】将 MongoDB 查询转换为雪花【英文标题】:Convert MongoDB query to Snowflake 【发布时间】:2020-11-07 09:20:34 【问题描述】:

我正在进行一个迁移项目(MongoDB 到 Snowflake)并尝试将其中一个 mongo 查询转换为 Snowflake,如果数组中的所有元素都根据给定参数匹配,我们有一个用例来获取记录。

Mongo DB 函数:$all $all 运算符选择其中的文档 字段的值是一个数组,包含所有指定的 元素。

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 中编写此查询提供一些建议? 任何建议都会有所帮助。

【问题讨论】:

【参考方案1】:

您可以使用 ARRAY_SIZE 和 ARRAY_INTERSECTION 对其进行测试:

这是示例表:

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 查询转换为雪花的主要内容,如果未能解决你的问题,请参考以下文章

如何将sql查询转换为mongodb查询中的exists

如何将此 sql 查询转换为 mongodb?

将sql连接查询转换为mongodb

MongoDB :: 将 SQL 转换为 MongoDB

将 MongoDB 查询结果转换为 JSONArray

如何将此类 sql 查询转换为 mongodb 查询