I’ve the following data structure:
- A
- _id
- B[]
- _id
- C[]
- _id
- UserId
I’m trying to run the following query:
where a.B._id == 'some-id' and a.B.C.UserId=='some-user-id'.
That means I need to find a B document that has a C document within with the relevant UserId, something like:
Query.And(Query.EQ("B._id", id), Query.EQ("B.C.UserId", userId));
This is not good, of course, as it may find B with that id and another different B that has C with that UserId. Not good.
How can I write it with the official driver?
If the problem is only that your two predicates on B are evaluated on different B instances (“it may find B with that ID and another different B that has C with that UserId”), then the solution is to use an operator that says “find me an item in the collection that satisfies both these predicates together”.
Seems like the $elemMatch operator does exactly that.
From the docs:
Try this:
Here’s a good explanation of $elemMatch and dot notation, which matches this scenario exactly.