tduccuong

tduccuong

MongoDb cursor API how to?

Hi all,

I am new to Elixir and are using this lib GitHub - elixir-mongo/mongodb: MongoDB driver for Elixir · GitHub 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

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

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

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.

Last Post!

PhamDuyBaoTrung

PhamDuyBaoTrung

Thanks guys

Where Next?

Popular in Announcing Top

danschultzer
In short Plug n’ play OAuth 2.0 provider library. Just set up a resource owner schema with Ecto (your user schema), install the dependen...
New
kip
ex_cldr provides localisation and internationalisation support based upon the data from the Unicode CLDR project. Unicode released CLDR ...
407 13256 120
New
tmbb
I’ve been working on two packages (not on hex.pm yet) to build admin interfaces for phoenix apps: bureaucrat - which contains a bunch ...
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 44532 311
New
maltoe
Hello! Came here to announce ChromicPDF, a pet project PDF generator I’ve been working on for the past few months. Why another PDF gener...
New
mplatts
With HEEX released we decided to start a components library using Tailwind CSS - check it out here: Petal Components. We also have a boi...
New
fuelen
Hey folks! Want to present a toolkit for writing command-line user interfaces. It provides a convenient interface for colorizing text...
New

Other popular topics Top

nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 records...
New
JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1144 54921 245
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New

We're in Beta

About us Mission Statement