After running some queries, I came to the conclusion that $in doesn’t work for an array of arrays.
You can use $elemMatch
instead and it’ll work, but it is frustrating that MongoDB’s documentation doesn’t warn about it.
I created this document:
{
"_id": "51cb12857124a215940cf2d4",
"level1": [
[
"item00",
"item01"
],
[
"item10",
"item11"
]
],
"items": [
"item20",
"item21"
]
}
Notice that the field “items” is an array of strings and this query works perfectly:
db.nested.findOne({"items":{"$in":["item20"]} })
Now, “level1.0” is also an array of strings, the only difference is that it’s inside another array. This query should work but isn’t:
db.nested.findOne({"level1.0":{"$in":["item00"]} })
The only way to get the result is using $elemMatch:
db.nested.findOne({"level1":{"$elemMatch":{"$in":['item00']}} })
So $elemMatch
solves the problem, but the real solution is to update MongoDB’s documentation to states that $in
doesn’t work for arrays of arrays. Perhaps you should submit a request to 10gen.