Logic of getting data from a Pointer in queries

Something has been bothering meā€¦
So far Iā€™ve been working around it, like a few other posts I see on the forum like:


When I query a table that has a User Pointer, I canā€™t figure out how to get out the attributes on the cloud side.

const query = new Moralis.Query('SoldItems')
return await query.find({useMasterKey:true})

This will return the Pointer like:

"User":{"__type":"Pointer","className":"_User","objectId":"xxxxxxxxxx"}

And when I return the results it includes the full User object, which I donā€™t want. I want to select only the username for example.

When I do this:

const query = new Moralis.Query('SoldItems')
query.select('User.username')
return await query.find({useMasterKey:true})

It spits out this (using cloud logger):

"User":{"username":"Tester 1","createdAt":"2021-08-04T11:36:34.183Z","updatedAt":"2021-08-16T09:28:19.992Z","ACL":{"xxxx":{"read":true,"write":true}},"objectId":"xxx","__type":"Object","className":"_User"}

Pretty good, but I donā€™t want the ACL or dates, I just want username!

I tested this:

   if (results) {
    for (let i = 0; i < results.length; i++) {
      items.push({
        username: results[i].attributes.User.attributes.username,
        username2: results[i].attributes.User.get('username'),
        attributes: results[i].attributes.User.attributes,
        user: results[i].attributes.User,
        user2: results[i].get('User').attributes.username,
        user3: results[i].get('User').get('username'),
      })
    }
  }
  return items

Which outputs only:

What am I missing here for parsing the User pointer?

Also in an aggregate pipeline itā€™s a struggle.

(pointer is called buyerUser in my db but I call it User here for the example)

Ok found this combi works!

Moralis.Cloud.define('getSellHistory', async (request) => {
  const query = new Moralis.Query(request.params.network+'SoldItems')
  query.equalTo('token_id', request.params.token_id)
  query.equalTo('token_address', request.params.token_address)
  query.equalTo('confirmed', true)
  query.select('askingPrice', 'createdAt', 'buyerUser.username', 'buyerUser.avatar', 'transaction_hash')
  query.descending('createdAt')
  const results = await query.find({useMasterKey:true})
  let items = []
  if (results) {
    for (let i = 0; i < results.length; i++) {
      items.push({
        createdAt: results[i].createdAt,
        askingPrice: results[i].attributes.askingPrice,
        transaction_hash: results[i].attributes.transaction_hash,
        buyer: {
          username: results[i].attributes.buyerUser.attributes.username,
          avatar: results[i].attributes.buyerUser.attributes.avatar._url,
        }
      })
    }
  }
  return items
},{
  fields : ['network','token_id','token_address'],
  requireUser: true 
})

Fantastic, so it means that the trick is in the query.select part :sweat_smile:
Weird but probably logical?

1 Like

Hi @matiyin

I really love your style of BUIDLing. Even when you post your questions you donā€™t stop solving the problem by yourself - itā€™s very cool. :mage:

1 Like

thanks @Yomoo, I always try to solve things myself, but sometimes a fresh eye helps very much!

Iā€™m still not fully happy with the results. Although it works, it feels illogical that I canā€™t get the User data any other way like with other data. Iā€™ve seen a few people on the forum tripping over this and so have I several times.
Do you know the logic behind it?

Thanks for tagging my post for the cloud function trouble! Iā€™m excited to see what youā€™ve done as Iā€™ve already reached another hurdle to overcome.

1 Like

If there were no hurdles, there was nothing to overcome and nothing left to conquer and enjoy. The drug of learning is easy to enjoy in tech, itā€™s always evolving much faster than anyone can keep up. Endless possibilities and new things to discover and learn.

Never give up! Cheers :robot: :space_invader:

2 Likes

Incredible! Thatā€™s all I had to do was specify the fields in query.select and the cloud function was able to cull data from ParseUser. Moralis FTW!!! I canā€™t believe I am doing this right now. Iā€™ve only learned to code with IoT academy and tutorials on YT lol. Thank you all!

3 Likes

Was banging my head for hours because of this. I tried using fetch() and even did a separate Query to User.

Your solution is by far the best! :pray:

Cheers

1 Like