2016-01-14 1 views
1

У меня есть узел и аэрокосмическая установка. Я хочу знать, как запустить запрос, где Bin1 == Bin2.Aerospike Query прочитал все записи с Bin1 == Bin2

В SQL

SELECT * FROM [test]t where t.EmployeeId == t.shipperid 

Можно ли это сделать? Я всегда могу запросить все значения из test и установить фильтр в nodejs. Однако я думаю, что это будет очень неэффективно. Пожалуйста, дайте мне знать, есть ли аэрокосмический способ сделать это?

ответ

1

Вы можете создать дополнительный ящик, "equal_ids", который имеет значение true, когда идентификаторы равны. Этот бит должен иметь вторичный индекс. Затем вы можете сделать вторичный индексный запрос для equal_ids==true

+0

Да, я мог бы это сделать, однако реальная проблема здесь в том, что сегодня я проверяю Bin1 == Bin 2 tom, было бы требование, когда мне нужно проверить Bin2 == Bin 3 (сверх и выше предыдущего проверить ?). В итоге я снова добавлю/обновляю логическое значение для всех существующих записей в базе данных. IMHO Работает как быстрое решение или для конкретного случая использования. Не работает в долгосрочной перспективе. – pravin

+1

IMO Это, вероятно, способ сделать это в мире NoSQL. Вам нужно знать все запросы, которые вы будете делать, а затем разработать совместимую схему для быстрого доступа. Это включает дублирование/избыточность данных, включая «дополнительные» логические значения, которые вы упомянули. Если ваши запросы разнообразны/непредсказуемы, возможно, решение SQL будет работать лучше. Возможно, кто-то более авторитетный может перезвонить. – Aaron

0

Это не поддерживается существующими предикатами query, но вы можете выразить это как stream UDF.

local function bin_match_filter(bin1, bin2) 
    return function(rec) 
    if rec[bin1] and rec[bin2] and 
     (type(rec[bin1]) == type(rec[bin2])) and 
     rec[bin1] == rec[bin2] then 
     return true 
    end 
    return false 
    end 
end 

local function map_record(rec) 
    local ret = map() 
    for i, bin_name in ipairs(record.bin_names(rec)) do 
    ret[bin_name] = rec[bin_name] 
    end 
    return ret 
end 

function check_bins_match(stream, bin1, bin2) 
    return stream : filter(bin_match_filter(bin1, bin2)) : map(map_record) 
end 

Теперь вы можете запустить записи совпавшие с помощью secondary index запроса или сканирования через этот поток UDF.