[SOLVED] Pointer Field Aggregate

Hello When I try aggregate with pointer key result return empty,

How can I handle it pointer object in this function

This code return empty

Moralis.Cloud.define("fetchFilteredRaces" , async(request) => {
   const query = new Moralis.Query('Race')    
   const pipeline = [
      {match: {$expr: {$and: [
        {$gt: ["$pricepool", request.params.pricepool]},
        {$eq: ["$leagueType", request.params.leagueType]},
      ]}}},
    ];
   const queryResult = await query.aggregate(pipeline) 
  return queryResult
})

This code working and return results

Moralis.Cloud.define("fetchFilteredRaces" , async(request) => {
   const query = new Moralis.Query('Race')    
   const pipeline = [
      {match: {$expr: {$and: [
        {$gt: ["$pricepool", request.params.pricepool]},
      ]}}},
    ];
   const queryResult = await query.aggregate(pipeline) 
  return queryResult
})

here is the part where it is a pointer used?

Yes,
Race Table is the main table,
the league is the pointer (reference) field on the race table and Δ°ts come from the league table.

I want to filter race according to multiple laegauTypes and other conditions such as price pool

For example;

The league is Class 1or Class 2 and price pool is 800

This is race table

This is league table

it may be possible, you can try to read in other forum threads, or search on google on how to do it with parse server

maybe this one helps you

you can handle object with create new object such as

const League = Moralis.Object.extend('League')
const league = new League()
league.id = league

//leage is set pointer object

const query =.new Moralis.Query('Race')
query.equalTo('leagueTpye', league)

did you find a solution to the initial problem?

Unfortunately,

I tried the different solutions,

Which one is or query. But I can. not give or condition dynamically, If I give manual such as LeaguesQuery[0], leaguesQuery[1] . It is working.
But I put , LeaguesQuery return construct error.

 const leagues = []
    const leaguesQuery = []
    for (let i = 0; i < filterOptions.leagues.length; i += 1) {
      const League = Moralis.Object.extend('League')
      const league = new League()
      league.id = filterOptions.leagues[i]
      leaguesQuery[i] = new Moralis.Query('Race')
      leaguesQuery[i].equalTo('leagueType', league)
    }
    const mainQuery = await Moralis.Query.or(LeaguesQuery[0], leaguesQuery[1]).find()
    const parsedResults = JSON.parse(JSON.stringify(mainQuery))
    console.log(parsedResults)

The second is with aggregate, but no error, return empty :frowning:
I logged inputs and others, everything is okay but dynamically input does not working

Moralis.Cloud.define("fetchFilteredRaces" , async(request) => {
   const leaguesQuery = []
   for (let i = 0; i < request.params.leagues.length; i += 1) {
        const League = Moralis.Object.extend('League')
        const league = new League()
        league.id = request.params.leagues[i]
        leaguesQuery[i] = new Moralis.Query('Race')
        leaguesQuery[i].equalTo('leagueType', league)
      }
      logger.info(leaguesQuery)
   const query = new Moralis.Query('Race')    
   const pipeline = [
      {match: {$expr: {$and: [
        {$gt: ["$pricepool", request.params.pricepool]},
        {$in: ["$leagueType", leaguesQuery]},
      ]}}},
    ];
   const queryResult = await query.aggregate(pipeline) 
  return queryResult
})

You can try to create the pointer directly as in the example that I pasted

Nope :frowning:

This is pointer , but still emtpy response

[{"where":{"leagueType":{"__type":"Pointer","className":"League","objectId":"NifQh6Zo9t5jQt7OU87tPFo5"}}}]

here it creates a list of queries, but it never runs them?

Yes, It returns empty result

I mean, you don’t want to run .find or .first() on those queries?

No, I want to run a query, of course, As you see above codes, When I run a query it’s not working, Because it is not handled pointer query parameters. For ex, If I query with a number column it returns a result. But When I want to query with a multiple pointer object it does not work.

This code return result without pointer object

Code;

Moralis.Cloud.define("fetchFilteredRaces" , async(request) => {
   const leaguesQuery = []
   const salih = []
   for (let i = 0; i < request.params.leagues.length; i += 1) {
        const League = Moralis.Object.extend('League')
        const league = new League()
        league.id = request.params.leagues[i]
        leaguesQuery[i] = new Moralis.Query('Race')
        leaguesQuery[i].equalTo('leagueType', league)
      }
      logger.info(JSON.stringify(leaguesQuery))
      salih.push(leaguesQuery[0])
   const query = new Moralis.Query('Race')    
   const pipeline = [
      {match: {$expr: {$and: [
        {$gt: ["$pricepool", request.params.pricepool]},
      //   {$in: ["$leagueType", salih]},
      ]}}},
    ];
   const queryResult = await query.aggregate(pipeline) 
  return queryResult
})

Result

7) [{…}, {…}, {…}, {…}, {…}, {…}, {…}]0: {racers: Array(0), users: Array(0), startAt: Sun Mar 27 2022 10:40:00 GMT+0300 (GMT+03:00), leagueType: ParseObject, raceType: ParseObject, …}1: {racers: Array(1), users: Array(1), startAt: Sun Mar 27 2022 11:04:44 GMT+0300 (GMT+03:00), leagueType: ParseObject, raceType: ParseObject, …}2: {racers: Array(0), users: Array(0), startAt: Sun Mar 27 2022 11:05:11 GMT+0300 (GMT+03:00), leagueType: ParseObject, raceType: ParseObject, …}3: {racers: Array(8), users: Array(8), startAt: Sun May 22 2022 16:50:02 GMT+0300 (GMT+03:00), leagueType: ParseObject, raceType: ParseObject, …}4: {racers: Array(8), users: Array(8), startAt: Sun May 22 2022 19:04:06 GMT+0300 (GMT+03:00), leagueType: ParseObject, raceType: ParseObject, …}5: {racers: Array(0), users: Array(0), startAt: Tue May 24 2022 10:00:00 GMT+0300 (GMT+03:00), leagueType: ParseObject, raceType: ParseObject, …}6: {racers: Array(0), users: Array(0), startAt: Wed May 25 2022 10:00:00 GMT+0300 (GMT+03:00), leagueType: ParseObject, raceType: ParseObject, …}length: 7[[Prototype]]: Array(0)

As you see, in this example, results return with the only price pool condition

but this line it not used, that means that all the code above is not used

Yeah, I mean when I use commented line, the code return empty. I just wanted to show my code is working with price pool condition

Moralis.Cloud.define("fetchFilteredRaces" , async(request) => {
   const leaguesQuery = []
   for (let i = 0; i < request.params.leagues.length; i += 1) {
        const League = Moralis.Object.extend('League')
        const league = new League()
        league.id = request.params.leagues[i]
        leaguesQuery[i] = new Moralis.Query('Race')
        leaguesQuery[i].equalTo('leagueType', league)
      }
      logger.info(leaguesQuery)
   const query = new Moralis.Query('Race')    
   const pipeline = [
      {match: {$expr: {$and: [
        {$gt: ["$pricepool", request.params.pricepool]},
        {$in: ["$leagueType", leaguesQuery]},
      ]}}},
    ];
   const queryResult = await query.aggregate(pipeline) 
  return queryResult
})

I’m not sure if this is expected to work this way, from what I understand, this code creates a list of queries, that are never executed in leaguesQuery array, and then it uses this syntax
{$in: ["$leagueType", leaguesQuery]}, where leaguesQuery is a list of queries

I found solution for my case with query . I can filter multiple pointer & multiple conditions. This is basic solution and may be improved

 async fetchRacesByFilter({ commit,dispatch,rootState }, payload) {
    const { filterOptions } = rootState.Filter
    const leagues = []
    const weathers = []
    let mainQuery = ''
    // const result = await Moralis.Cloud.run('fetchFilteredRaces', filterOptions)

   if(filterOptions.weathers != undefined){
    for (let i = 0; i < filterOptions.weathers.length; i += 1) {
      const Weather = Moralis.Object.extend('Weather')
      const weather = new Weather()
      weather.id = filterOptions.weathers[i]
      weathers.push(weather)
    }
  }
  if(filterOptions.leagues != undefined){
    for (let i = 0; i < filterOptions.leagues.length; i += 1) {
      const League = Moralis.Object.extend('League')
      const league = new League()
      league.id = filterOptions.leagues[i]
      leagues.push(league)
    }
  }
    const pQuery = new Moralis.Query('Race')
    pQuery.greaterThan('pricepool', filterOptions.pricepool);
    pQuery.equalTo('state', STATE_FINISHED())
    console.log(pQuery)

    const lQuery = new Moralis.Query('Race')
    lQuery.containedIn('leagueType', leagues);
 
    const wQuery = new Moralis.Query('Race')
    wQuery.containedIn('weatherType', weathers);


    if(leagues.length > 0 && weathers.length > 0){
      mainQuery = Moralis.Query.and(
      Moralis.Query.and(lQuery,wQuery,pQuery)
    )
    }
    else if(leagues.length > 0 && weathers.length == 0){
      mainQuery = Moralis.Query.and(
        Moralis.Query.and(lQuery,pQuery)
      )
    }
    else if(leagues.length == 0 && weathers.length > 0){
      mainQuery = Moralis.Query.and(
        Moralis.Query.and(wQuery,pQuery)
      )
    }
    else if(leagues.length == 0 && weathers.length == 0 && filterOptions.pricepool > 0 ){
      mainQuery = Moralis.Query.and(pQuery)
    }
    if(leagues.length > 0 || weathers.length > 0 || filterOptions.pricepool>0){
      const results = await mainQuery.find()
      const parsedResults = JSON.parse(JSON.stringify(results))
      commit('SET_RACES', parsedResults)
      commit('SET_IS_LOAD_RACES', true)
    }
    else {
      dispatch('fetchInitialRaces')
    }
    
  },
1 Like