Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MongoDB null field or true/false

Tags:

mongodb

On MongoDB, when we have fields such as "draft" (yes/no), "published" (yes/no), etc which is the best strategy? Create the field in all the records and put "yes"/"no" values or put the field just where exists?

posts: [{_id:1, text:"hello", draft:true},{_id:2 text:"world", draft:false}]

or

posts: [{_id:1, text:"hello", draft:true},{_id:2 text:"world"}]

Which is faster? It's for a large amount of data.

Best regards, João

like image 728
joaoqalves Avatar asked Jul 24 '12 15:07

joaoqalves


People also ask

How check field is null in MongoDB?

MongoDB fetch documents containing 'null' If we want to fetch documents from the collection "testtable" which contains the value of "interest" is null, the following mongodb command can be used : >db. testtable. find( { "interest" : null } ).

Are null values allowed in MongoDB?

Indeed, it's not possible to store null values in a MongoDB document using a DataFrame. The Python None values are considered as missing attributes accordingly to this NoSQL specific allowance. However, if your column is numerical, you can force writing a null value by setting it to NaN.

How do I make a field not null in MongoDB?

Basically, we can use the $exists a method to implement the not null in MongoDB. When <boolean> is valid, $exists coordinates with the records that contain the field, including reports where the field esteem is invalid. In case <boolean> is bogus, the question returns just the records that don't contain the field.

What is meant by boolean in MongoDB?

Booleans use less storage than an integer or string and avoid any unexpected side effects of comparison. For example, in a MongoDB find() query a string of "1" will not match a numeric value of 1 or a boolean value of true . If you want to store boolean values, definitely use a boolean type.


1 Answers

Faster for what? Omitting the field when the value is false will result in slightly smaller documents, which could result in a slight overall speed increase.

But omitting the field makes it harder to query for false, specially if you have a mix of omitted fields and explicit false values.

Notice what the different queries return with this sample collection:

> db.test.find()
{ "_id" : ObjectId("500eeb7c42d87d5d861e1219") }
{ "_id" : ObjectId("500eeb8242d87d5d861e121a"), "b" : false }
{ "_id" : ObjectId("500eeb8642d87d5d861e121b"), "b" : true }
> 
> db.test.find({b:true})
{ "_id" : ObjectId("500eeb8642d87d5d861e121b"), "b" : true }
>
> db.test.find({b:false})
{ "_id" : ObjectId("500eeb8242d87d5d861e121a"), "b" : false }
>
> db.test.find({b:{$exists:false}})
{ "_id" : ObjectId("500eeb7c42d87d5d861e1219") }
>
> db.test.find({$or:[{b:false},{b:{$exists:false}}]})
{ "_id" : ObjectId("500eeb7c42d87d5d861e1219") }
{ "_id" : ObjectId("500eeb8242d87d5d861e121a"), "b" : false }
> 

Notice that the query you have to write if you have a mix of omitted and explicitly false values is more complicated and might lead to slower query execution.

like image 173
Robert Stam Avatar answered Sep 22 '22 13:09

Robert Stam