1

I have the following Python code:

from pymongo import MongoClient
db = MongoClient("mongodb://localhost/")["admin"]
collection = db["collection_test"]
collection.insert_one({"key1": 1000000000.1, "key2": 1.1})
doc = collection.find_one()
print(type(doc["key1"]))
print(type(doc["key2"]))

Which prints:

<class 'float'>
<class 'float'>

But based on the docs I expected the types to be

<class 'bson.decimal128.Decimal128'>

followed by something like 'bson.double'.

Why aren't I seeing a BSON Decimal128 and a BSON Double? Is type() not the correct way to get the types in this context?

1 Answer 1

1

Python floats are stored as BSON doubles. The API converts them on insertion and converts them back when querying.

If you want to store and retrieve BSON Decimal128 values, use bson.decimal128.Decimal128()

from bson.decimal128 import Decimal128

db = MongoClient()["mydatabase"]
collection = db["collection_test"]

collection.insert_one({"key1": Decimal128("1000000000.1"), "key2": Decimal128("1.1")})
doc = collection.find_one()
print(type(doc["key1"]))
print(type(doc["key2"]))

prints:

<class 'bson.decimal128.Decimal128'>
<class 'bson.decimal128.Decimal128'>

Documentation (albeit somewhat confusing): https://pymongo.readthedocs.io/en/stable/api/bson/index.html

Also: be careful of using the admin database; it's a special database in MongoDB.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.