FormidableLabs / groqd

A schema-unaware, runtime and type-safe query builder for GROQ.
https://commerce.nearform.com/open-source/groqd
MIT License
230 stars 16 forks source link

Conditional array references have broken my brain #217

Closed shealan closed 11 months ago

shealan commented 1 year ago
q("*")
    .filterByType("project")
    .grab({
      _id: q.string(),
      name: q.string(),
      category: q("tagsCategory").deref().grabOne("_id", q.string()),
      sector: q("sectors.primarySector").deref().grabOne("_id", q.string()),
      deliverables: q("tagsDeliverable")
        .filter()
        .deref()
        .grabOne("_id", q.string()),
      awards: q("awards[].awardType->._id"),
    }),

I can't work out how do stop my awards field from returning null if the field is not included, or empty in my project document. It's not a required field so sometimes this does happen.

There's probably a simple way, but I am must be overlooking it.

I need to return either [] or ['string','string']

Anyone got any pointers?

carbonrobot commented 11 months ago

You can use coalesce for this from GROQ standard syntax.

q("*")
    .filterByType("project")
    .grab({
      _id: q.string(),
      name: q.string(),
      category: q("tagsCategory").deref().grabOne("_id", q.string()),
      sector: q("sectors.primarySector").deref().grabOne("_id", q.string()),
      deliverables: q("tagsDeliverable")
        .filter()
        .deref()
        .grabOne("_id", q.string()),
      awards: q("coalesce(awards[].awardType->._id, [])"),
    }),

Arcade Example