Hello,
I have a document type Client
and a document type Product
. I also have a document type ClientProduct
that has the relation between a Client
and a Product
by their ID. The idea is when a Client
buys a Product
this association is stored in the ClientProduct
document. With this model I can easilly get all the Product
s a given Client
bought. However, I’m not sure the approach I should follow in order to get only the Product
s that weren’t bought by that Client
in particular.
- How can I get only the
Product
s that weren’t bought by a given Client
?
Thanks in advance. 
Two options. This is the same as in a relational database.
(1) Use EXCEPT.
(2) Use NOT IN.
See the N1QL documentation on both.
You can perform the following queries:
CREATE INDEX on bucket("Client::" || clientId)
WHERE docType="ClientProduct";
SELECT p.*
FROM bucket p
WHERE docType="Product"
AND p.docID NOT IN ARRAY r.productId FOR r IN (
SELECT cp.productId
FROM bucket c USE KEY "Client::" || $1
LEFT OUTER JOIN bucket pc ON KEY "Client::" || cp.clientId FOR c
WHERE c.docType="Client"
AND cp.docType="ClientProduct"
) END;
where $1
is you given client
.
Do you agree with this approach? @geraldss
I agree as long as it works 
Please try it out.
@geraldss, I was already using NOT IN, but I was doing the array part wrong.
Thanks, @manusyone! It worked! 
1 Like