Elliot Chance
Elliot Chance

Reputation: 5746

MongoDB: Does saving a document rewrite the whole document?

I have the collection domain with documents that contain domain information. Part of that is the historical whois records, which may be zero or more and by far take up the majority of the space for the document.

If I load the entire document, change something small (like update a number field) and use the save() method will mongo flush the entire document to disk or only update the BSON that has changed? Ultimately my question is, should I bother complicating my code with update()'s to save on I/O or should I just use save()?

This isn't purely due to lazyness, the document (after it gets read in entirety) goes through a series of steps to modify/process the document and if any changes have been made the entire document is saved. But if the cost of saving the document is high then maybe I have to think about it a different way...

Upvotes: 8

Views: 6831

Answers (4)

Gianmarco Barca
Gianmarco Barca

Reputation: 26

I am currently going through the "Introduction to MongoDB" University course and on the "MongoDB Data Modeling Intro" module it states that "Embedding data will make the document larger and impact write performance. As more data is added to each document, the entire document is rewritten into MongoDB data storage". I hope this helps!

Upvotes: 1

Comtaler
Comtaler

Reputation: 1630

I know this question is old, but it's very useful to know how it works to help you design your database structure. Here is the details about MongoDB's storage engine: https://docs.mongodb.com/v3.2/faq/storage/

The document answers the question. Basically, if you update an integer field in MongoDB, it will mark the page(normally 4k) in memory where the integer resides in to be dirty and it will write memory page to disk on the next disk flush. So, if your document size is very big, the chance is that it will only write partial of your document into disk.

However, there are many other cases. If you are padding more data to your document, there is chances that MongoDB needs to move the entire document to a new location for the document to grow. In that case, the entire document will be written to disk.

Upvotes: 4

Sergio Tulentsev
Sergio Tulentsev

Reputation: 230481

This depends on a client library you are using. For example, Mongoid (ODM in ruby) is smart enough to only send fields that were changed (using $set command). It is sometimes too smart and doesn't catch changes that I made to nested hashes. But I've never seen it send unchanged fields.

Other libraries/drivers may behave differently.

Upvotes: 2

fdsaas
fdsaas

Reputation: 714

You can update a single field in a document with $set. This will modify the field on disk. However, if the document grows beyond the size before the update, the document may have to be relocated on disk.

Meanwhile, here is what the documentation says about save versus update:

>// x is some JSON style object
>db.mycollection.save(x); // updates if exists; inserts if new
>
>// equivalent to:
>db.mycollection.update( { _id: x._id }, x, /*upsert*/ true );

References

Upvotes: 6

Related Questions