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 cli
You can use .expr
with .map
for a cleaner alternative to .eqJoin
r.expr(array).map(function(id) {
return r.table('user').get(id);
});
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)]
Update for 2017. Use the ES6 spread operator '...'
r.db('vp').table('user').getAll(...["0", "0", "99"])
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)