Mongoose / MongoDB `updateOne` with `upsert` on bucket pattern document registers many more read ops than write

Viewed 19

Overview

My question concerns the amount of read vs write units that register on MongoDB Atlas after updateOne operations on documents in a bucket pattern.

Background

I have a stream of steady IoT data for measurements at minute intervals. I decided to bucket these measurements daily and so they are stored in documents that have a startDate and endDate field compartmentalising each day. Here's a representative schema:

{
  "_id": "6323bcf78fd1d0c6dc571110",
  "endDate": "2022-09-16T23:59:59.000Z",
  "startDate": "2022-09-16T00:00:00.000Z",
  "batteryVoltageSum": 2455.2400000000002,
  "count": 678,
  "packetRSSISum": -34791,
  "measurements": [
    {
        "timestamp" : ISODate("2022-09-16T01:00:01.000+01:00"),
        "temperature" : 29.19889502762431,
        "batteryVoltage" : 3.64,
    }
    ... (up to 1439 more)
  ]
}

Every time I updateOne using the Mongoose model, I use the $push aggregation to add a measurement to the relevant array above. If the bucket does not exist, I insert it, and use the $setOnInsert aggregation to set some field.

Expected Behaviour

Since updateOne with upsert does not retrieve the document it updates or inserts, there should only be write units registered on MongoDB Atlas.

Actual Behaviour

Every time updateOne is triggered, the expected write units are registered, but, I also see a much bigger amount of read units that seem to grow proportionally with the size of the measurements array. This is proof that the updateOne operation is in fact also triggering reads for some reason.

Here's a screenshot of this from my logs. As you can see, at the beginning of each day when the bucket has no measurements, the read units are much less and they can be seen to grow throughout the day as measurements are recorded at minute intervals.

MongoDB Atlas r/w unit monitor 24h

Question

Why are reads metered that are proportional to the size of a nested array when I am only performing an updateOne (with upsert) operation on such a document?

0 Answers
Related