2015-12-11 3 views
1

Каков способ реализации «частотного» запроса в reThinkDB для некоторого значения?rethinkdb частота значений

Пример данных:

[{ 
akey : "1", 
anotherkey : "2" 
}, { 
akey : "1", 
anotherkey : "2" 
}, { 
akey : "AAA", 
anotherkey : "BBB" 
}, { 
akey : "CCC", 
anotherkey : "CCC" 
}] 

Если выход для akey в качестве параметра:

{ 
    "1" : 2, 
    "AAA" : 1, 
    "CCC" : 1 
} 

Если выход для anotherkey в качестве параметра:

{ 
    "2" : 2, 
    "BBB" : 1, 
    "CCC" : 1 
} 
+0

У вас есть массив в документе, который выглядит как ваши данные примера, или каждый '{akey:" 1 ", другой ключ:" 2 "}' представляет отдельный документ? – Tholle

+0

@Tholle - это отдельные документы. – nha

ответ

1

Вы можете попробовать что-то вроде этого:

r.expr([{ 
akey : "1", 
anotherkey : "2" 
}, { 
akey : "1", 
anotherkey : "2" 
}, { 
akey : "AAA", 
anotherkey : "BBB" 
}, { 
akey : "CCC", 
anotherkey : "CCC" 
}]).map(function(doc) { 
    return r.branch(doc.keys().contains('akey'),{'value': doc('akey')},{}) 
}) 
.group('value') 
.count() 
.ungroup() 
.map(function(doc) { 
    return r.object(doc('group'), doc('reduction')) 
}) 
.reduce(function(left, right) { 
    return left.merge(right) 
}) 

Другой способ сделать это без reduce является:

r.expr([{ 
akey : "1", 
anotherkey : "2" 
}, { 
akey : "1", 
anotherkey : "2" 
}, { 
akey : "AAA", 
anotherkey : "BBB" 
}, { 
akey : "CCC", 
anotherkey : "CCC" 
}]).map(function(doc) { 
    return r.branch(doc.keys().contains('anotherkey'),{'value': doc('anotherkey')},{}) 
}) 
.group('value') 
.count() 
.ungroup() 
.map(function(doc) { 
    return [doc('group'), doc('reduction')] 
}) 
.coerceTo('object') 

Однако, мне нравится reduce путь, потому что он отображает, как я думаю о всем процессе.

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