Querying MongoDB to match in the first item in an array
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.
Solution 1:
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.
Solution 2:
You can use dot notation for array indexes:
db.products.find({"imgs.0": "http://foo.jpg"})
Here is an excerpt from the relevant documentation for dot notation.
MongoDB uses the dot notation to access the elements of an array and to access the fields of a subdocument.
To access an element of an array by the zero-based index position, concatenate the array name with the dot (.) and zero-based index position, and enclose in quotes:
'<array>.<index>'
Additionally, here is a link to the relevant array documentation.