Search code examples
mongodbsnowflake-cloud-data-platformsnowflake-schemasnowflake-task

Convert MongoDB query to Snowflake


I'm working on a migration project (MongoDB to Snowflake) and trying to convert one of the mongo queries to Snowflake, we have a use case to fetch records if all the elements from an array matched based on the given parameters.

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 Query:

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

Could you provide some suggestions on how to write this query in Snowflake? Any recommendations would be helpful.


Solution

  • You can use ARRAY_SIZE and ARRAY_INTERSECTION to test it:

    Here is sample 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) ;
    

    Here is query to test:

    select * from test where code in ('C0001','C0002')
    and ARRAY_SIZE( ARRAY_INTERSECTION(  months, array_construct( 3, 2 ))) = 2;
    

    So I find the intersection of two arrays, and check the number of items. If you want to look for 3 items, you should set 3 (and it goes like this):

    select * from test where code in ('C0001','C0002')
    and ARRAY_SIZE( ARRAY_INTERSECTION(  months, array_construct( 3, 2, 7 ))) = 3;