在RethinkDB中,我试图将多个查询链接到多个数据库表。这个想法与传统dB的存储过程相同。基本上我查询连接到设备的所有用户,然后为每个用户尝试从规则表中获取附加的规则。 以下是我正在编写的ReQL查询的要点。但是forEach不起作用,因为它想要一个写查询而不是读取而且do()失败了。有什么建议吗?
const get_distance = function(location){
const final_location = 500;
return r.expr(500).sub(location);
};
const run_rule = function(device,distance){
return r.db('locationtracker_development').table('customer_details').filter(function(cust){
return cust("deviceId").contains(device);
}).pluck("userId").forEach(function(userName){
//TODO Work on each user
return r.db('locationtracker_development').table('user_rules').filter({'userId':userName('userId')});
});
};
r.do(get_distance(100)).do(function(dist){
return run_rule('gXtzAawbc6',dist);
});
答案 0 :(得分:1)
我已经在RethinkDB的Slack Channel的帮助下解决了这个问题。
以下是代码:
const get_distance = function(location){
const final_location = 500;
return r.expr(500).sub(location);
};
const run_rule = function(device,distance){
return r.db('locationtracker_development').table('customer_details').filter(function(cust){
return cust("deviceId").contains(device);
}).coerceTo('array').map(function(doc){
return doc('userId');
}).do(function(userIds){
//return userIds;
return r.db('locationtracker_development').table('user_rules').
getAll(r.args(userIds),{index:'userId'});
});
};
r.do(get_distance(100)).do(function(dist){
return run_rule('gXtzAawbc6',dist);
});
基本上返回的对象需要被强制转换为Array,然后使用map和do功能,我们可以实现查询多个DB。