In MongoDB,
To query for records that contain certain fields you can do:
collection.find({'field_name1': {'$exists': true}})
And that will return any record that has the ‘field_name1’ field set…
But how do you query mongo to find records that contains ONLY ‘field_name1’ (and no other fields)? I’d like to be able to do this for, say, a list of fields.
The sad answer, as you’ll often find with MongoDB and other NoSQL databases is probably that it would be best to structure your data in a way that allows you to query it as simply as possible.
That said, there are ways of doing this, but as far as I know, it requires you execute JavaScript server side. This will be slow, and cannot possibly take advantage of indexes and other logical features of MongoDB, so use it only if it’s absolutely necessary, if performance is at all important.
So, the easiest way to do this, is probably to create a function that returns the number of fields in an object, which we can use with the $where query syntax. This allows you to run arbitrary JavaScript queries against your data, and can be combined with normal syntax queries.
Sadly, my JavaScript-fu is a little weak, so I don’t know how (or if) you can get at the count of members of an object in JS in a one-liner, so to do this, I would store a function server side.
From the mongo shell, execute the following:
With that, you have a saved JavaScript function, server side, called
countFieldsthat returns the number of elements in an object. Now, you need to execute your find-operation with the$wherequery:This would give you only the documents that meet both the
$existscondition, and the$whereclause. Note that I’m comparing with 2 in the example, since thecountFieldsfunction counts_idas a field.