> Perhaph it's my misunderstanding, but this would seem to be more of an intersection operation on keys rather than a delete. Hm...why? We remove all elements, which are contains in the first and second jsonb ("f": [4, 5] in this case) from the first one.
> Could there be a corresponding jsonb_except function which does the opposite (i.e. returns everything on the left side except where it matches with the right)? and if I understand your question correctly, this is exactly what the jsonb_delete_jsonb will do, isn't it?. > Is there a use-case for the example you've given above, where you take JSON containing objects and arrays, and flatten them out into a one-dimensional array? Hm...actually I don't know about such use-cases. This function is analog of the hstore_to_array (and the similar function hstore_to_matrix), which is used sometimes, judging by github. So I thought this function should be implemented (after this question I'm not so sure). > What should happen if "g" or {"g"} were used instead? Did you mean {"g": "key"}? Hmm...but in any case, I suppose this new object should be appended to the array as a regular element. =# jsonb_add_to_path('{"b": {"c": ["d", "f"]}}'::jsonb, {b, c}::text[], '"g"'::jsonb); jsonb_add_to_path --------------------------------------- {"b": {"c": ["d", "f", "g"]}} > This is a bit strange. Why did "f" get flattened out of "d"? The main purpose if this function is to get values for required keys from all nesting levels (actually, I thougth it will be not so convenient otherwise and I didn't consider the implementation with path usage). If this so confusing, I can remove this function from the list =) On 20 March 2015 at 00:08, Alvaro Herrera <alvhe...@2ndquadrant.com> wrote: > Thom Brown wrote: > > On 19 March 2015 at 14:35, Alvaro Herrera <alvhe...@2ndquadrant.com> > wrote: > > > Thom Brown wrote: > > >> On 19 March 2015 at 14:12, Alvaro Herrera <alvhe...@2ndquadrant.com> > wrote: > > >> > Dmitry Dolgov wrote: > > >> > > > >> >> * jsonb_slice - extract a subset of an jsonb > > >> >> Example of usage: > > > Okay, so it pulls it all parents? So I guess you'd get this too: > > > > SELECT jsonb_slice('{"a": 1, "b": {"c": 2}, "d": {"f": 3}, "f": > > 4}'::jsonb, ARRAY['b', 'f', 'x']); > > > > jsonb_slice > > ------------------------------------------------ > > {"a": 1, "b": {"c": 2}, "d": {"f": 3}, "f": 4} > > Yeah, except "a" wouldn't be output, of course. (The example gets more > interesting if "d" contains more members than just "f". Those would not > get output.) > > > > >> Although I'm still a bit confused about "f" being produced. > > > > > > I guess you could say that the second argument is an array of element > > > paths, not key names. So to get the result I suggest, you would have > to > > > use ARRAY['{b}', '{d,f}', '{x}']. (Hm, this is a non-rectangular > > > array actually... I guess I'd go for ARRAY['b', 'd//f', 'x'] instead, > or > > > whatever the convention is to specify a json path). > > > > I think that's where jsquery would come in handy. > > If that's what we think, then perhaps we shouldn't accept jsonb_slice at > all because of ambiguous mode of operation. > > -- > Álvaro Herrera http://www.2ndQuadrant.com/ > PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services >