jmespath / jmespath/jmespath.py

Looking for a "join-like" or "lookup-like" expression.

Open
#149 0 comments 5 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
2.4k
Forks
212
PR merge metrics
No merged PRs in 30d

Description

Hello,

First and foremost, thanks in advance for sharing JMESPath which I find very elegant and powerful.

I have recently been faced with a challenge for which I could not build a single JMESPath expression that solves it for me. Consider the case of a JSON document like:

```
{
"things": [{
"id": 1,
"name": "Thing #1",
"owner_id": 1
}, {
"id": 2,
"name": "Thing #2",
"owner_id": 2
}, {
"id": 3,
"name": "Thing #3",
"owner_id": 1
}],
"users": [{
"id": 1,
"name": "User #1"
}, {
"id": 2,
"name": "User #2"
}]
}
```

The objective would be to return a the list of `things` where each `owner_id` wold be "resolved", so to speak, from the entries in the `users` array. To put it In SQL-ish terms, I'm looking to join `things` and `users` on `things[*].owner_id` and `users[*].id`.

After trying multiple things, the best and cleanest (albeit non-working!) solution I came up with was something like:

```
things[*].{id: id, owner_id:owner_id, owner:users[?id == owner_id]}
```

Unfortunatelly, within the multiselect hash, the expression for `owner` can't resolve `users`. It's clearly a matter of scope. Having investigated furter, I found out about JEP 11 https://github.com/jmespath/jmespath.site/pull/6 and it seems like the `let` function could be a possible solution.

Facts:
* I could create a custom function to handle my particular need.
* With JEP 11 in place, I could build an expression to solve this particular challenge.

Other than those two options, am I missing something that could be used currently?

Thanks in advance.
Regards.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.