Comments (2)
Note that in addition to not preserving the order of elements, fetch_links
may even change the length of the returned list by removing duplicate elements. In summary, fetch_links
behaves like an $in
query, not like a list fetch.
The offending code is here, in the LinkTypes.LIST
branch of the construct_query
function in beanie.odm.utils.find
:
beanie/beanie/odm/utils/find.py
Lines 270 to 275 in 51e73eb
I see this as more of a correctness issue than a convenience issue. As a mongodb datastructure, arrays can contain duplicates and their order is part of their semantics. Users will expect fetching an array to fetch elements in order, including duplicates. I believe there are ways to dereference an array of ids efficiently, but even if it turns out that this is a fundamentally slow operation, then I think the solution would be to warn users of the conditions under which the operation is slow rather than to break array semantics.
As a proof of concept, here is an example query that does an in-order list fetch that could be modified to replace the existing $lookup
stage in construct_query
(playground link: https://mongoplayground.net/p/t7TyJK1oOEI)
db.orders.aggregate([
{
$unwind: "$items"
},
{
$lookup: {
from: "inventory",
localField: "items.$id",
foreignField: "_id",
as: "items"
}
},
{
$group: {
_id: "$_id",
items: {
$push: {
$first: "$items"
}
},
__oldRoot: {
$last: "$$ROOT"
}
}
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: [
"$__oldRoot",
{
items: "$items"
}
]
}
}
}
])
The idea is to unwind the array, perform an efficient lookup on the id, group the results into an object containing the fetched array and the old document, then merge the old document with a new document containing the fetched items.
from beanie.
@roman-right How do you feel about the solution proposed here? Have I missed anything or do you have other concerns that I could help address? Before submitting a PR I would want to have you on-board with the general plan.
from beanie.
Related Issues (20)
- [BUG] Missing documentation for `beanie.odm.BulkWriter` HOT 1
- [BUG] (some) type annotations for session wrong HOT 3
- [BUG] type annotation for init_beanie() should use Sequence
- [BUG] before_event of type Update HOT 5
- [BUG] mypy does not raise error when trying to access a non-existing attribute from a beanie Document. HOT 1
- [BUG] Indexed unique will not work after Field regex. HOT 2
- [BUG] Empty BackLink for `Optional[BackLink[ADoc]]` when document has no back-link HOT 3
- Concerns and Suggestions Regarding Beanie Library HOT 2
- [Doc] Document for soft delete feature HOT 2
- [BUG] pydantic computed properties omitted during `insert_many` operation on Document HOT 1
- [BUG] get_motor_collection() returning None under volume only HOT 1
- [BUG] search criteria not using pydantic Field alias to set the key.
- [BUG] `PydanticObjectId` isn't properly configured when deserializing from JSON
- depth search "find(Teste.item1.item2.item3.id == id)" [BUG]
- [BUG] Link not working in find queries on fields with alias
- [BUG]
- [BUG] BulkWriter does not allow unordered bulks
- [BUG] `original_field` is not supported by pydantic, makes typecheckers give a type error and causes a warning at runtime HOT 1
- [BUG] optional link type field in the form of union type expression (Link[A] | None bitwise or operation between link type and None) can not be recognized.
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from beanie.