tduccuong
MongoDb cursor API how to?
Hi all,
I am new to Elixir and are using this lib https://github.com/ankhers/mongodb to work with MongoDB. The doc says it has “Streaming cursor” feature, but the source code implements only Enumerable protocol for the cursor returned by the Mongo.find function.
There is no doc about a cursor API, or do I miss something?
Thanks a lot!
Most Liked
Ankhers
Since this is for a website, you would not have access to the same cursor between requests. For something like this, you would structure your query like
page = 3 # This would be coming in from the URL
limit = 10 # 10 items per page
skip = (page - 1) * limit # This assume your first page is 1, so you will skip 0 for the first page, 10 for the second page, etc
options = [limit: limit, skip: skip, ...] # ... is representing any other options you want to pass in.
Mongo.find(connection, collection, query, options)
Then you are free to render the results as you see fit.
tduccuong
When use this method with sort: %{<field>: <order>} option, it seems the sorting is not done in the entire result space but only on the returned batch, unless I set page = 0 and limit = <number of all items in DB>
E.g., say I have 10 items in DB labeled 1 --> 10. Say an unsorted query, with limit = 10, returns
[1, 3, 2, 4, 8, 5, 9, 7, 6, 10]
Now if I set limit = 5, and sort increasing order, then with page = 0, 1, the two returned batches are:
[1, 2, 3, 4, 8]
and
[5, 6, 7, 9, 10]
What I want are:
[1, 2, 3, 4, 5]
and
[6, 7, 8, 9, 10]
Could u pls show me the way to achieve that, if there is?
Thanks a lot!
Ankhers
I am not seeing the same behaviour.
iex(1)> Mongo.find(pid, "coll", %{}) |> Enum.to_list
[
%{"_id" => #BSON.ObjectId<5e8f5cd37f1ab13c7b1d99a9>, "coll" => 1},
%{"_id" => #BSON.ObjectId<5e8f5cd67f1ab13c7b1c6ea3>, "coll" => 2},
%{"_id" => #BSON.ObjectId<5e8f5cd87f1ab13c7b8e3b4a>, "coll" => 5},
%{"_id" => #BSON.ObjectId<5e8f5cd97f1ab13c7b686cc8>, "coll" => 3},
%{"_id" => #BSON.ObjectId<5e8f5cdc7f1ab13c7bdb8c4c>, "coll" => 7},
%{"_id" => #BSON.ObjectId<5e8f5ce17f1ab13c7b6ebc61>, "coll" => 8},
%{"_id" => #BSON.ObjectId<5e8f5ce37f1ab13c7bae3a15>, "coll" => 10},
%{"_id" => #BSON.ObjectId<5e8f5ce57f1ab13c7b2069ea>, "coll" => 9},
%{"_id" => #BSON.ObjectId<5e8f5cea7f1ab13c7b1f336f>, "coll" => 4},
%{"_id" => #BSON.ObjectId<5e8f5d0c7f1ab13c7b5b4023>, "coll" => 6}
]
iex(2)> limit = 5
5
iex(3)> page = 1
1
iex(4)> skip = (page - 1) * limit
0
iex(5)> Mongo.find(pid, "coll", %{}, limit: limit, skip: skip, sort: [coll: 1]) |> Enum.to_list
[
%{"_id" => #BSON.ObjectId<5e8f5cd37f1ab13c7b1d99a9>, "coll" => 1},
%{"_id" => #BSON.ObjectId<5e8f5cd67f1ab13c7b1c6ea3>, "coll" => 2},
%{"_id" => #BSON.ObjectId<5e8f5cd97f1ab13c7b686cc8>, "coll" => 3},
%{"_id" => #BSON.ObjectId<5e8f5cea7f1ab13c7b1f336f>, "coll" => 4},
%{"_id" => #BSON.ObjectId<5e8f5cd87f1ab13c7b8e3b4a>, "coll" => 5}
]
iex(6)> page = 2
2
iex(7)> skip = (page - 1) * limit # Make sure you are setting the proper value for skip each time.
5
iex(8)> Mongo.find(pid, "coll", %{}, limit: limit, skip: skip, sort: [coll: 1]) |> Enum.to_list
[
%{"_id" => #BSON.ObjectId<5e8f5d0c7f1ab13c7b5b4023>, "coll" => 6},
%{"_id" => #BSON.ObjectId<5e8f5cdc7f1ab13c7bdb8c4c>, "coll" => 7},
%{"_id" => #BSON.ObjectId<5e8f5ce17f1ab13c7b6ebc61>, "coll" => 8},
%{"_id" => #BSON.ObjectId<5e8f5ce57f1ab13c7b2069ea>, "coll" => 9},
%{"_id" => #BSON.ObjectId<5e8f5ce37f1ab13c7bae3a15>, "coll" => 10}
]
Would you be able to show something similar to what I just did there? If you can, I may be able to help figure out what is going wrong.







