2015-11-16 2 views
0

У меня есть следующий запрос, который работает нормально, но это медленно, но я не могу понять, как индексировать его правильно:RethinkDB индекс запроса с несколькими .Contains()

r.db('my_db') 
.table('messages') 
.filter({ community_id : community.id}) 
.filter(function(row){ 
    return row('mentions').contains(user.id); 
}) 
.filter(function(row){ 
    return row('channels').contains(channel.id); 
}) 
.orderBy(r.desc('created_at')) 
.skip(0) 
.limit(50); 

Я попытался с помощью следующего индекса (с использованием Thinky.js):

Model.ensureIndex("user_mentions", function(message){ 
    return message("mentions").map(function(user_id){ 
     return message("channels").map(function(channel_id){ 
      return [ 
       message("community_id"), 
       message("mentions").contains(user_id), 
       message("channels").contains(channel_id), 
       message('created_at') 
      ]; 
     }); 
    }); 

}, {multi: true}); 

, а затем запросить его я попытался это:

r.db('my_db') 
.table('messages') 
.between(
    [community.id, user.id, channel.id, r.minval], 
    [community.id, data.user.id, channel.id, r.maxval], 
    { index : 'user_mentions' } 
) 
.orderBy({index:r.desc("user_mentions")}) 
.skip(0) 
.limit(50); 

сообщений, таблица ло oks как:

id | community_id | mentions (array of user_ids) | channels (array of channel_ids) | created_at 

Но в итоге я получаю нулевые результаты. Я очень благодарен за любые предложения!

ответ

0

Я думаю, что этот показатель будет сделать запрос between вы писали выше работы:

.indexCreate(function(message) { 
    return message('channels').concatMap(function(channel) { 
    return message('mentions').map(function(mention) { 
     return [ 
     message('community_id'), 
     mention, 
     channel, 
     message('created_at') 
     ]; 
    }); 
    }); 
}, {multi: true}); 
+0

Так близко, так concatMap вместо карты, спасибо! – jesperado

 Смежные вопросы

  • Нет связанных вопросов^_^