Querying MongoDB to match in the first item in an array

JVG picture JVG · Nov 11, 2013 · Viewed 59.2k times · Source

I'm aware of the $in operator, which appears to search for an item's presence in array, but I only want to find a match if the item is in the first position in an array.

For instance:

{
    "_id" : ObjectId("0"),
    "imgs" : [
        "http://foo.jpg",
        "http://bar.jpg",
        "http://moo.jpg",
        ]
},
{
    "_id" : ObjectId("1"),
    "imgs" : [
        "http://bar.jpg",
        "http://foo.jpg",
        "http://moo.jpg",
        ]
}

I'm looking for a query akin to:

db.products.find({"imgs[0]": "http://foo.jpg"})

This would/should return the ObjectId("0") but not ObjectId("1"), as it's only checking against the first image in the array.

How can this be achieved? I'm aware I could just create a separate field which contains a single string for firstImg but that's not really what I'm after here.

Answer

poundifdef picture poundifdef · Nov 11, 2013

I believe you want imgs.0. eg, given your example document, you want to say: db.products.find({"imgs.0": "http://foo.jpg"})

Be aware that referencing array indexes only works for the first-level array. Mongo doesn't support searching array indexes any deeper.