Hi,
Having a problem with pymongo
bson.errors.InvalidDocument: Cannot encode object: {‘lastupdated’, datetime.datetime(2015, 8, 26, 0, 3, 50)}
How did you people solve this? any ideas?
Hi,
Having a problem with pymongo
bson.errors.InvalidDocument: Cannot encode object: {‘lastupdated’, datetime.datetime(2015, 8, 26, 0, 3, 50)}
How did you people solve this? any ideas?
Welcome to the community @Haki_Dere,
This looks related to the Ticket: Migration exercise and the updates for movie_last_updated_migration.py, can you confirm if my understanding is correct?
If this is correct, have you edited this file and specifically updated this line:
predicate = {"some_field": {"$some_operator": "some_expression"}}
In terms of the update necessary to the code, it will involve the field “lastupdated” and two operators ("$exists" and “$type”).
Can you share the code you have updated for those two lines as both of these need to be updated in the file movie_last_updated_migration.py for that specific exercise?
Hope this helps and please let me know if I’ve mistaken your question and it relates to a different lesson/exercise.
Kindest regards,
Eoin
Hey Eoin,
Thanks for your response, very kind of you!.
Here is the code:
pymongo version: pymongo==3.7.2
predicate = {"lastupdated": {"$type": "string"}}
projection = {"lastupdated": 1}
cursor = mflix.movies.find(predicate, projection)
# this will transform the "lastupdated" field to an ISODate() from a string
movies_to_migrate = []
for doc in cursor:
doc_id = doc.get('_id')
lastupdated = doc.get('lastupdated', None)
movies_to_migrate.append(
{
"doc_id": ObjectId(doc_id),
"lastupdated": parser.parse(lastupdated)
}
)
print(f"{len(movies_to_migrate)} documents to migrate")
try:
# build the UpdateOne so it updates the "lastupdated" field to contain
# the new ISODate() type
bulk_updates = [UpdateOne(
{"_id": movie.get("doc_id")},
{"$set": {"lastupdated", movie.get("lastupdated")}}
) for movie in movies_to_migrate]
# here's where the bulk operation is sent to MongoDB
bulk_results = mflix.movies.bulk_write(bulk_updates)
print(f"{bulk_results.modified_count} documents updated")
except InvalidOperation:
print("no updates necessary")
except Exception as e:
raise e
Hi @Haki_Dere
You should also add “$exists”: True to your predicate, the rest of your code looks correct.
Kindest regards,
Eoin