π Thanks to @tylerganter for the pull request to significantly improve the performance of update_many.
π In this release:
update_many now uses bulk writes which significantly improves the performance of calling update_many.unset and unset_methods have now been added to the Frame class.ElemMatch function which previously would raise an error if a raw condition was given instead of a Condition instance.It's now possible to set the collection options for a frame within a given context, such as:
with MyFrame.with\_options(read\_preference=ReadPreference.SECONDARY): my\_frame = MyFrame.one()
π This release also sees a move to pymongo>=3.9.0 requirements.
This release has moved the minimum pymongo requirement to 3.8+. To support this change we've replaced a number of pymongo deprecated method calls, including update with update_one and count with count_documents or estimated_document_count. This does not change theupdate and count methods / API for MongoFrames.
π In addition I fixed an issue where using $slice in a reference projection wasn't correctly, for example in the expression:
projection={ 'name': True, 'show\_date\_str': True, 'leads': { '$ref': User, '$slice': 1, 'first\_name': True, 'last\_name': True } }
This now correctly selects the first Id in the leads field to use as a reference when selecting the assoicated users
π Previous to this release projections within $sub or $sub. where simply ignored and the projection was converted to True for the key, for example:
lairs = Lair.many( projection={ '\_id': True, 'inventory': { '$sub': Inventory, 'gold': True } )
Previously used the projection:
{
'_id: True,
'inventory': True
}
π In this release this will now project to:
{
'_id: True,
'inventory.gold': True
}
π NOTE: This release is a minor release as whilst this should effect existing code if you've previous been setting projections (which simply were ignored before) this could potentially break this code.
For example this is now possible:
projection={
'employees': {
'$ref': Employee,
'$slice': 2,
'name': True
}
}
So get the first 2 employee Ids in an array of employee Ids stored against the field employees and project them as Employee documents selecting only the name field for each.