Header logo.
A study of bugs
HomeArchiveTagsAboutFeed

Week 46 gave me surprises

A few things:

Handling date and time is more complicated than I expected. python-dateutil is quite helpful when you need to parse a datetime string.

A pitfall

I tried updating a field in a MongoDB document using MongoEngine. The value of that field was an embedded document that contained four sub-fields. I intended to change the value of subkey2. But the entire embedded document was overwritten.

{
    key1: value1,
    key2: value2,
    key3: {
        subkey1: subvalue1,
        subkey2: subvalue2,
        subkey3, subvalue3
    }

    # After updating, this field instead became this...
    # ...and this is not what I wanted
    key3: {
        subkey2: newvalue
    }
}

I'm quite glad I caught this potential bug early on. And indeed, smart people out there have figured it out.

Baffling decimals

I was trying to check if the submitted value and the value found in MongoDB are the same. This field was defined as a decimal.

In order to try it out, I artificially submitted a JSON object that contained a number with two decimal places (69.30) and the value I saved in MongoDB was 69.3 of decimal type (or I thought so).

But Decimal(submitted_value) == Decimal(mongodb_value) returned False.

Printing out the two values, I got:

# submitted_value
69.30 
# mongodb_value
69.299999999999997157829056...

The reason of this turned out to be: Although I defined this field to be a DecimalField with precision=2 in MongoEngine, the value actually stored in MongoDB was still a Double.

And a float number is supposed to do this.