Miguel De Leon
Miguel De Leon

Reputation: 11

Cloud Datastore Projection Query with filters with AppEngine NodeJS Standard

I am learning GCP, and have searched through the documentation. The Projection queries documentation states that they can be used with filters albeit with some limitations. As far as I understand I am not falling within the limitations, but still I cannot make it work.

What I want to do is a simple

SELECT property FROM kind WHERE enabled = TRUE 

The properties are marked as indexed, I have also deployed an index.yaml. And my code is the following

  const selectQuery = programTypeQuery
     .select(entityNameProperty)
     .filter('enabled',true);

When commenting the select line, the query works. When commenting the filter line, it also works, but when running both I get the following message in postman.

{
"code": 9,
"metadata": {
    "_internal_repr": {}
},
"note": "Exception occurred in retry method that was not classified as transient"
}

My log just shows a 400 status error.

Any help will be appreciated

EDIT:

this is the full code. I have a parameter that indicates the language of the name. in the database I have nameEn and nameEs as properties, so I want to return only the name in the selected language. enabled is a boolean property that indicates if the product is active or not.

const Datastore = require('@google-cloud/datastore');
const datastore = Datastore();
const programTypeQuery = datastore.createQuery('programType')

entityNameProperty = 'name' + req.params.languageCode

const selectQuery = programTypeQuery
.select(entityNameProperty)
.filter('enabled',true);

selectQuery.runQuery()
.then((results) => {
res.json(results);
})
.catch(err => res.status(400).json(err));

Upvotes: 1

Views: 526

Answers (2)

Yurci
Yurci

Reputation: 576

From the details you provided it is hard to detect where this issue is being originated. Can you use Google APIs Explorer for Datastore API and try your query. I prepared the request body according to your descriptions, you can click here and execute it by just changing the projectId. By doing this you will receive a sucessful response or an error message with details, it might be easier to detect the root cause from here.

Upvotes: 1

Jim Morrison
Jim Morrison

Reputation: 2887

Most likely you are missing a composite index definition. You should be able to look at your GAE logs in stackdriver to see the error message returned from Cloud Datastore.

Since your property name is dynamic you won't be able to use a composite index effectively. You'll probably need to change your data model to something that doesn't use dynamic property names.

Upvotes: 0

Related Questions