MongoDB nested array query

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.

Leave a Comment