Alright, I tried it. Frankly, I'm confused as to why this is getting so many up-votes. If someone could elaborate what they enjoyed so much, I'd be interested to hear.
I didn't enjoy this experience one bit. It didn't feel interactive to me. Each step is basically "Run this query that is already typed out for you" without any explanation, whatsoever, about what each part of what I was writing was doing. This was followed by an invitation to click a link to documentation to try something else on the line of code you don't understand.
It begins with:
>r.db('test').tableCreate('tv_shows').run()
My first questions: what is r? What does db() do? Is there a test database somewhere? Why do I have to call run() when there's a button saying "Run this query"? Do you sometimes not run() things?
The tutorial doesn't remember your position if you go back to it so it's a good thing, I guess, that it opens a new tab for you when you access the documentation to list the tables.
Even more questions: What happened to r.db('test') that I needed to use? Is r now that database? Why didn't I just do r.tableCreate('tv_shows') before?
I did this with basically every step of the process but stopped just short of finishing because I wasn't learning much and wasn't sure where it was going. I found myself simply wondering what the heck RethinkDB was.
This tutorial could really use some more explanation, interaction, flow and direction. Tell me what I'm about to do. Tell me why what I'm about to do is worth my time and cool. Start with r, go from there. At least I won't be lost from the get-go.
Let me write stuff out as you're telling me what I'm doing. That's interacting.
This feedback is wonderful, thank you. It's often hard to do a good job when you're neck deep in your own concepts because you lose perspective. (I'm responsible for the tutorial, btw, and it's my screwup). I'll make everything work better.
To answer your questions here:
> what is r?
It's a module where all the RethinkDB operations are defined. The tutorial is running the same JavaScript driver code as you'd run if you connected to C++ RethinkDB server from node.js, which is why you have to start with `r`.
> What does db() do?
It refers to a database named 'test'. This is where you're creating the table
> Is there a test database somewhere?
Yes. It's set up by default at the beginning.
> Why do I have to call run() when there's a button saying "Run this query" do you sometimes not run() things?
Because you can type multiple queries in the text box. Every time you end a query with `.run()`, that's when it goes to the server and gets executed there. We've been talking about not having people type `.run` for a single query, but it's a bit difficult to solve.
> What happened to r.db('test') that I needed to use? Is r now that database?
If you omit r.db() at the beginning of the query, it picks a default one (which is 'test'). It's the same as you'd do in MySQL.
> Why didn't I just do r.tableCreate('tv_shows') before?
We thought allowing tableCreate in a default database allows people to make mistakes too easily, so we disallowed it. It confuses people, so we'll add it back. Sorry for confusion.
Let me try to address some of these questions here, before figuring out how to improve the tutorial.
`r`: is the top level ReQL namespace that gives you access to the functions defined
r.db('name'): is accessing the 'test' database. RethinkDB supports multiple databases. You can specify which one to use on a per connection basis or for each query.
The 'test' database is a default database (in principle it's similar to MySQL's test database). Being the default also means that you don't need to use `.db('test')` in each query.
`run`: ReQL allows chaining multiple functions together. Basically creating a query is a bit like using a builder pattern. These chained ops are all sent to the server and executed on the database. There is a single roundtrip. Basically `run` tells the query builder: "now it's your time to do something for me".
As side comments
1. initially we added much more details about each query, but we ended up with quite a bit of text compared to short queries. We thought it would be more intuitive the reduce the description part and provide links to the API. It looks like that wasn't the best solution.
2. we chose to have the query pre-typed instead of having it part of the description only as we assumed mostly everyone would just copy paste it. Assumption proved incorrect!
Indeed I remember doing MongoDB and Redis online tutorials and typing everything out myself and they felt great. This tutorial was too annoying to finish. Took a big break from coding, thought maybe it's because I'm rusty. Apparently not!
So take a careful look at Mongo and Redis tutorials. They made it feel easy, maybe why they got so popular.
Could also be that RethinkDB has fundamentally more complex syntax so not as suited to quickstart tutorials. When I did Mongo and Redis I didn't know SQL and didn't have to. With innerJoins everywhere you need SQL as prerequisite.
I couldn't agree more - it's less a tutorial and more a slideshow of 10 queries and the results.
Not only that, but I found the documentation extremely lacking (almost nonexistent) when I was attempting to do the additional queries. When I was confused, there was nowhere to see the 'right answer' for the query and an explanation of why, I just had to guess at the syntax until I got it right.
In the former case you're creating a query (similar to SQL insert) that puts data into the database. You can then take advantage of indexing, sharding, durability guarantees, caching, a specialized query language, and all the other benefits of a database system.
In the latter case you're creating a data structure in the host language (which of course is immensely useful, but completely different).
The main difference is what happens if you chain together multiple operations. Are these executed one by one (each resulting in a roundtrip to the database) or executed all at once (single roundtrip to the db).
As a side note, each programming language has its own idioms. We tried to bring the ReQL query to each language in a way that felt as close as possible to the host PL (as opposed to say SQL which you need to use it as it is; and that led to the hundreds or thousands of wrapper libraries/ORMs. etc).
One thing I can't understand is if "RethinkDB is built to store JSON documents", why then there are tables?
And also, probably I should better explore website, but is it transactional? In other words, is it possible to save multiple documents and RethinkDB server will reject them in case of conflict, just like all-or-nothing semantic in couchdb before ver. 0.9?
if "RethinkDB is built to store JSON documents", why then there are tables?
JSON docs are stored in tables -- a table is just a collection of JSON documents. We of course also support arrays, but the reason why we start with tables as a primitive is that it allows doing significant optimizations that otherwise would be very hard/impossible. If the entire DB was one huge JSON document, optimizations would be much more difficult to do. Grouping docs into tables essentially gives the system a hint as to the usage intent.
is it transactional?
Only for changes on a single document. There are no transactional guarantees on queries that touch more than one document.
Currently RethinkDB has official drivers for three languages, Python, JavaScript, and Ruby. I hope you understand why it would be difficult for us to support many more than this. Eventually we're counting on support for 3rd party drivers from the community. In fact, there are already a few early community drivers from some intrepid contributors including for Haskell and Go.
We've had lots of requests for more drivers and lots of offers to build them, but we've asked our volunteers to hold off while we revamp the driver interface to make it significantly easier to build drivers for RethinkDB. Having written the first JS driver myself and the new version I can attest to the much greater ease of doing so with the new API.
The next release (1.4) due very soon will include these changes and a driver development kit to support 3rd party efforts. After that I'm sure you'll see a PHP driver emerge very quickly.
[+] [-] randomdrake|13 years ago|reply
I didn't enjoy this experience one bit. It didn't feel interactive to me. Each step is basically "Run this query that is already typed out for you" without any explanation, whatsoever, about what each part of what I was writing was doing. This was followed by an invitation to click a link to documentation to try something else on the line of code you don't understand.
It begins with:
>r.db('test').tableCreate('tv_shows').run()
My first questions: what is r? What does db() do? Is there a test database somewhere? Why do I have to call run() when there's a button saying "Run this query"? Do you sometimes not run() things?
The tutorial doesn't remember your position if you go back to it so it's a good thing, I guess, that it opens a new tab for you when you access the documentation to list the tables.
Let's move to the second step:
>r.table('tv_shows').insert([{ name: 'Star Trek TNG', episodes: 178 }, { name: 'Battlestar Galactica', episodes: 75 }]).run()
Even more questions: What happened to r.db('test') that I needed to use? Is r now that database? Why didn't I just do r.tableCreate('tv_shows') before?
I did this with basically every step of the process but stopped just short of finishing because I wasn't learning much and wasn't sure where it was going. I found myself simply wondering what the heck RethinkDB was.
This tutorial could really use some more explanation, interaction, flow and direction. Tell me what I'm about to do. Tell me why what I'm about to do is worth my time and cool. Start with r, go from there. At least I won't be lost from the get-go.
Let me write stuff out as you're telling me what I'm doing. That's interacting.
[+] [-] coffeemug|13 years ago|reply
To answer your questions here:
> what is r?
It's a module where all the RethinkDB operations are defined. The tutorial is running the same JavaScript driver code as you'd run if you connected to C++ RethinkDB server from node.js, which is why you have to start with `r`.
> What does db() do?
It refers to a database named 'test'. This is where you're creating the table
> Is there a test database somewhere?
Yes. It's set up by default at the beginning.
> Why do I have to call run() when there's a button saying "Run this query" do you sometimes not run() things?
Because you can type multiple queries in the text box. Every time you end a query with `.run()`, that's when it goes to the server and gets executed there. We've been talking about not having people type `.run` for a single query, but it's a bit difficult to solve.
> What happened to r.db('test') that I needed to use? Is r now that database?
If you omit r.db() at the beginning of the query, it picks a default one (which is 'test'). It's the same as you'd do in MySQL.
> Why didn't I just do r.tableCreate('tv_shows') before?
We thought allowing tableCreate in a default database allows people to make mistakes too easily, so we disallowed it. It confuses people, so we'll add it back. Sorry for confusion.
[+] [-] alexpopescu|13 years ago|reply
Let me try to address some of these questions here, before figuring out how to improve the tutorial.
`r`: is the top level ReQL namespace that gives you access to the functions defined
r.db('name'): is accessing the 'test' database. RethinkDB supports multiple databases. You can specify which one to use on a per connection basis or for each query.
The 'test' database is a default database (in principle it's similar to MySQL's test database). Being the default also means that you don't need to use `.db('test')` in each query.
`run`: ReQL allows chaining multiple functions together. Basically creating a query is a bit like using a builder pattern. These chained ops are all sent to the server and executed on the database. There is a single roundtrip. Basically `run` tells the query builder: "now it's your time to do something for me".
As side comments
1. initially we added much more details about each query, but we ended up with quite a bit of text compared to short queries. We thought it would be more intuitive the reduce the description part and provide links to the API. It looks like that wasn't the best solution.
2. we chose to have the query pre-typed instead of having it part of the description only as we assumed mostly everyone would just copy paste it. Assumption proved incorrect!
Thanks a lot!
alex @ rethinkdb
[+] [-] Detrus|13 years ago|reply
So take a careful look at Mongo and Redis tutorials. They made it feel easy, maybe why they got so popular.
Could also be that RethinkDB has fundamentally more complex syntax so not as suited to quickstart tutorials. When I did Mongo and Redis I didn't know SQL and didn't have to. With innerJoins everywhere you need SQL as prerequisite.
[+] [-] manacit|13 years ago|reply
Not only that, but I found the documentation extremely lacking (almost nonexistent) when I was attempting to do the additional queries. When I was confused, there was nowhere to see the 'right answer' for the query and an explanation of why, I just had to guess at the syntax until I got it right.
[+] [-] ebbv|13 years ago|reply
How is:
> r.table('tv_shows').insert([{ name: 'Star Trek TNG', episodes: 178 }, { name: 'Battlestar Galactica', episodes: 75 }]).run()
Easier than:
> db['tv_shows'].push([{ name: 'Star Trek TNG', episodes: 178 }, { name: 'Battlestar Galactica', episodes: 75 }]);
Seems to me like a totally unnecessary abstraction which only adds complication and potential points of failure and bugs.
EDIT:
Ok never mind this does actually create a real database. From the demo it seemed like it was just creating a JSON object.
[+] [-] coffeemug|13 years ago|reply
In the latter case you're creating a data structure in the host language (which of course is immensely useful, but completely different).
[+] [-] alexpopescu|13 years ago|reply
As a side note, each programming language has its own idioms. We tried to bring the ReQL query to each language in a way that felt as close as possible to the host PL (as opposed to say SQL which you need to use it as it is; and that led to the hundreds or thousands of wrapper libraries/ORMs. etc).
alex @ rethinkdb
[+] [-] wildchild|13 years ago|reply
And also, probably I should better explore website, but is it transactional? In other words, is it possible to save multiple documents and RethinkDB server will reject them in case of conflict, just like all-or-nothing semantic in couchdb before ver. 0.9?
[+] [-] coffeemug|13 years ago|reply
JSON docs are stored in tables -- a table is just a collection of JSON documents. We of course also support arrays, but the reason why we start with tables as a primitive is that it allows doing significant optimizations that otherwise would be very hard/impossible. If the entire DB was one huge JSON document, optimizations would be much more difficult to do. Grouping docs into tables essentially gives the system a hint as to the usage intent.
is it transactional?
Only for changes on a single document. There are no transactional guarantees on queries that touch more than one document.
[+] [-] ScottBurson|13 years ago|reply
[+] [-] throwawayG9|13 years ago|reply
[+] [-] wmrowan|13 years ago|reply
We've had lots of requests for more drivers and lots of offers to build them, but we've asked our volunteers to hold off while we revamp the driver interface to make it significantly easier to build drivers for RethinkDB. Having written the first JS driver myself and the new version I can attest to the much greater ease of doing so with the new API.
The next release (1.4) due very soon will include these changes and a driver development kit to support 3rd party efforts. After that I'm sure you'll see a PHP driver emerge very quickly.
[+] [-] tucson|13 years ago|reply
[+] [-] jabagonuts|13 years ago|reply
[+] [-] fizx|13 years ago|reply
[+] [-] shin_lao|13 years ago|reply
[+] [-] andr3w321|13 years ago|reply
[+] [-] neumino|13 years ago|reply