#reduce #rethinkdb
#уменьшить #rethinkdb
Вопрос:
у меня проблема. У меня есть запрос в rethinkdb, но при попытке удалить элементы с одним повторением атрибута возникает проблема.
таблица данных
[
{
codeQR: '100001597182620700',
numid: '1000081',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
},
{
codeQR: '100001597182749578',
numid: '1000082',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
},
{
codeQR: '100001597185279006',
numid: '1000082',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
},
{
codeQR: '100001597183951080',
numid: '1000082',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
},
{
codeQR: '100001597183951216',
numid: '1000083',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
},
{
codeQR: '100001597185279182',
numid: '1000083',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
},
{
codeQR: '100001597182864764',
numid: '1000083',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
},
{
codeQR: '100001597185307862',
numid: '1000084',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
},
{
codeQR: '100001597183974288',
numid: '1000084',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
},
{
codeQR: '100001597183002590',
numid: '1000084',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
}
]
запрос с помощью rethinkdb
r.db('myDb').table('userSearchData')
.filter(querys=>
querys('numid').gt('1000080')
.and(
querys('numid').lt(String('1000085'))
)
)
.limit(5)
и этот запрос показывает это:
[
{
codeQR: '100001597182620700',
numid: '1000081',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
},
{
codeQR: '100001597182749578',
numid: '1000082',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
},
{
codeQR: '100001597185279006',
numid: '1000082',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
},
{
codeQR: '100001597183951080',
numid: '1000082',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
},
{
codeQR: '100001597183951216',
numid: '1000083',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
}
]
итак, проблема в том, что, если вы видите, в массиве есть элементы с атрибутом numid, и я хочу, чтобы в нем отображался только один элемент с таким же номером. Я решил это с помощью функции reduce () javascript, подобной этой
let datas=resultQuery.reduce((arry, val)=>{
if(arry.length){
if(!arry.some(val2=>val2.numid===val.numid)){
arry.push(val)
}
}else
arry.push(val)
return arry
}, [])
console.log(datas, 'FT array filter', __filename)
и конечный результат:
[
{
codeQR: '100001597182620700',
numid: '1000081',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
},
{
codeQR: '100001597182749578',
numid: '1000082',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
},
{
codeQR: '100001597183951216',
numid: '1000083',
user: 'a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5'
}
]
Но есть только 3 элемента из 5, которые я заказал
Img показывает, чего я хочу с этим rethinkdb
Ответ №1:
Вы можете использовать group
для группировки ваших данных путем сопоставления numid
. Затем выберите первые записи в этой группе. Я не уверен, каким должен быть желаемый выбор, но вы можете реализовать любые критерии в функции map.
r.db('myDb').table('userSearchData')
.filter(querys=>
querys('numid').gt('1000080')
.and(
querys('numid').lt(String('1000085'))
)
)
.group("numid")
.ungroup()
.map(r.row("reduction")(0))
.limit(5)
Группировка данных приведет к получению сегментов следующим образом:
[
{
"group": "1000081",
"reduction": [
{
"codeQR": "100001597182620700",
"numid": "1000081",
"user": "a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5"
}
]
},
{
"group": "1000082",
"reduction": [
{
"codeQR": "100001597183951080",
"numid": "1000082",
"user": "a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5"
},
{
"codeQR": "100001597182749578",
"numid": "1000082",
"user": "a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5"
},
{
"codeQR": "100001597185279006",
"numid": "1000082",
"user": "a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5"
}
]
}
//....
]
Затем вам придется использовать ungroup
функцию, чтобы продолжить добавление методов в запрос. И с помощью map()
вы выбираете первый элемент каждого сокращения.
тогда ваш результат:
[
{
"codeQR": "100001597182620700",
"numid": "1000081",
"user": "a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5"
},
{
"codeQR": "100001597183951080",
"numid": "1000082",
"user": "a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5"
},
{
"codeQR": "100001597185279182",
"numid": "1000083",
"user": "a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5"
},
{
"codeQR": "100001597183974288",
"numid": "1000084",
"user": "a1d0c8d0-7305-43b1-8b4d-d9a6274d76f5"
}
]
Ответ №2:
Результат, который вы получаете, правильный. Я не знаю точно, каковы ваши ожидания:
let datas=resultQuery.reduce((arry, val)=>{
if(arry.length){
if(!arry.some(val2=>val2.numid===val.numid)){
arry.push(val)
}
}else
arry.push(val)
return arry
}, [])
console.log(datas, 'FT array filter', __filename)
- в первом элементе arry.length значение false, поэтому вы просто добавляете элемент
- второй элемент, который вы проверяете, если numid еще не существует -> добавить элемент
- нумид уже существует -> пропустить
- нумид уже существует -> пропустить
- создать нумидию -> добавить элемент
Комментарии:
1. с помощью reduce () javascript я не работаю непосредственно в rethinkdb, я работаю с результатом, например, в этом случае я хочу получить 4 элемента, но я мог получить только 3, потому что rethinkdb выдает мне один массив с 5 элементами, но некоторые элементы этого массива повторяются, я хочу, чтобы rethinkdb выдавал мне 4 элемента без повторения в массиве. Я поместил изображение в свой пост, чтобы показать больше данных о моей проблеме
2. понятно, а как насчет использования
.distinct()
прямо перед.limit(5)
?3. distinc работает только тогда, когда все массивы имеют одинаковое содержимое, но для этих элементов codeQR не похожи, по этой причине distinct() ничего не делает