rql get multiple documents from list of keys rethinkdb in javascript

耗尽温柔 提交于 2019-11-30 03:29:31

问题


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) {
    
    })
    

回答1:


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)]



回答2:


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)



回答3:


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

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



回答4:


You can use .expr with .map for a cleaner alternative to .eqJoin

r.expr(array).map(function(id) {
  return r.table('user').get(id);
});


来源:https://stackoverflow.com/questions/20347960/rql-get-multiple-documents-from-list-of-keys-rethinkdb-in-javascript

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!