HI Michael, in the Mango world I think your intersection example would be 
satisfied by

{ “_readers”: { “$in”: user.authTokens } }

Cheers, Adam

> On Mar 22, 2016, at 5:37 PM, Michael Fair <[email protected]> wrote:
> 
> What about some list operation functions?
> like "[one of the things in this list] is a member of [the things in that
> list]"?
> 
> One of the use cases I often see, and have wanted myself is per document
> user authorization.  Without trying to solve everything all at once, being
> able to efficiently compare membership multiple lists as a filter would be
> generically useful.
> 
> 
> Imagine the _users document contained "authTokens" which is simply a list
> of strings  or numbers that the user is authorized as.
> 
> These authTokens would most likely represent group names that the user
> belonged to.  The list is flat, not hierarchical.  If a user is a member of
> Group 1, and Group 1 is a member of Group 2; then the authTokens list will
> have both Group 1 and Group 2 in the list. (databasename_authTokens would
> contain a database specific list of tokens.)
> 
> How the list gets assigned is outside the scope here (let's just say
> there's either a management app or the app itself has to do it).
> 
> Each doc then has an "_readers" list.  It represents the list of authTokens
> that have been given permission to read the document.
> 
> 
> The filter query could then be something like "intersect(user.authTokens,
> doc._readers).length > 0" the intersect command returns a list of
> overlapping list members; the length of that list being the count of
> members in common; and being greater than 0; means there was at least one
> match.
> 
> 
> 
> Other functions would be:
> union: A list that is the combination of all lists with duplicates removed
> filter: A list made from the first list, with all members of the other
> lists removed
> intersect: A list of only things in all lists
> outersect: A list of only things that exist on one of the lists
> member: A boolean where the length of the intersect > 0 (this would be
> better used in the example above)

Reply via email to