Querying Mongo documents for array properties

Ladies and gents, I’m just posting one short reminder to myself and anyone keen to find out how do we query array type fields in mongodb.

Let’s start by inserting couple of documents (using mongodb shell) which we’ll use for querying afterwards:

db.developers.insertMany([
    { "name" : "John", "languages" : ["java", "php", "javascript"] },
    { "name" : "Jack", "languages" : ["java", "c", "c++"] },
    { "name" : "Jim", "languages" : ["node", "java"] }
]);

Now, when we run the following command in shell:

db.developers.find()

Command output confirms all test documents are successfully stored:

{
	"_id" : ObjectId("587e6ec738cbd11c2dc46932"),
	"name" : "John",
	"languages" : [
		"java",
		"php",
		"javascript"
	]
}
{
	"_id" : ObjectId("587e6ec738cbd11c2dc46933"),
	"name" : "Jack",
	"languages" : [
		"java",
		"c",
		"c++"
	]
}
{
	"_id" : ObjectId("587e6ec738cbd11c2dc46934"),
	"name" : "Jim",
	"languages" : [
		"node",
		"java"
	]
}

Now, say you want to find all documents that have “java” as the first entry in languages array field, we do by using following syntax:

db.developers.find({"languages.0" : "java"})

Command output confirms we matched correct document(s):

{
	"_id" : ObjectId("587e6ec738cbd11c2dc46932"),
	"name" : "John",
	"languages" : [
		"java",
		"php",
		"javascript"
	]
}
{
	"_id" : ObjectId("587e6ec738cbd11c2dc46933"),
	"name" : "Jack",
	"languages" : [
		"java",
		"c",
		"c++"
	]
}

Array position is indexed as expected starting by zero, so in case we want all docs having “java” at second position, we do it like this:

db.developers.find({"languages.1" : "java"})

Next, if we want to list all documents that contain “java” at any position inside languages array field, we do it like this:

db.developers.find({"languages" : "java"})

Command output lists all initially inserted documents:

{
	"_id" : ObjectId("587e6ec738cbd11c2dc46932"),
	"name" : "John",
	"languages" : [
		"java",
		"php",
		"javascript"
	]
}
{
	"_id" : ObjectId("587e6ec738cbd11c2dc46933"),
	"name" : "Jack",
	"languages" : [
		"java",
		"c",
		"c++"
	]
}
{
	"_id" : ObjectId("587e6ec738cbd11c2dc46934"),
	"name" : "Jim",
	"languages" : [
		"node",
		"java"
	]
}

Finally, if we want to find all documents that have languages field exact to let’s say:

["java", "php", "javascript"]

we do it like this:

db.developers.find({"languages" : ["java", "php", "javascript"]})

Command output prints something like:

{
	"_id" : ObjectId("587e6ec738cbd11c2dc46932"),
	"name" : "John",
	"languages" : [
		"java",
		"php",
		"javascript"
	]
}

I’m primary keeping this as a quick reminder to myself, but will be very happy if someone else finds it useful!

Stay tuned and don’t forget to subscribe!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s