Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

rql get multiple documents from list of keys rethinkdb in javascript

I have a table of "person" data, which has a unique key "id". I have a list of id's that I want to get the data for which I'll be sending as a JSON array from the client to the server. The serve recieves that data as a JSON array.

Now is there a way to run a query that will get the documents for each of those ids?

Or is my only option to parse the ids myself and build an array of results, then send that array back.

So far I've tried using...

  • getAll - but I cannot get this to work because it accepts a dynamic amount of parameters, and I don't know how to change my array of values into a dynamic amount of parameters.

    (example... I want to be able to do whats shown below, but I can't)

    r.db('vp').table('user').getAll(["0", "0", "99"])
    

    I can only do this...

    r.db('vp').table('user').getAll("0", "0", "99")
    
  • expr and forEach - as seen below, but I don't think this can work.

    var arr = [];
    r.expr(["0", "0", "99"]).forEach(function(id) {
    
    })
    
like image 702
CamHart Avatar asked Dec 03 '13 10:12

CamHart


3 Answers

You can also use getAll with a dynamic array. You have to resort to apply

var ids = [1,2,3];
var table = r.table("person");
table.getAll.apply(table, ids).run( connection, callback);

Note that now since 1.12, you can just do

var ids = [1,2,3];
r.table("person").getAll(r.args(ids)).run(connection, callback)
like image 72
neumino Avatar answered Nov 14 '22 11:11

neumino


short answer:

r.expr([id1, id2, id3]).eqJoin(function(doc) { return doc; }, r.table("person"))

Longer answer:

There are a couple of ways to do this. The above is what I'd call the canonical way. Let's breakdown what's happening:

First with r.expr([id1, id2, id3]) we're packaging up the array to send it over to the server.

Then we call eqJoin what it does is take a stream of values and dispatch and indexed get for each one. The function(doc) { return doc; } is a slightly ugly hack because eqJoin requires a mapping function.

So in the end the above code becomes equivalent to:

[r.table("person").get(id1), r.table("person").get(id2), r.table("person).get(id3)]
like image 20
Joe Doliner Avatar answered Nov 14 '22 12:11

Joe Doliner


Update for 2017. Use the ES6 spread operator '...'

r.db('vp').table('user').getAll(...["0", "0", "99"])
like image 42
Visualize Avatar answered Nov 14 '22 10:11

Visualize