Querying MongoDB to match in the first item in an array

ArraysMongodbMongodb Query

Arrays Problem Overview


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.

Arrays Solutions


Solution 1 - Arrays

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 - Arrays

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJVGView Question on Stackoverflow
Solution 1 - ArrayspoundifdefView Answer on Stackoverflow
Solution 2 - ArraysLixView Answer on Stackoverflow