как удалить элемент с атрибутом repeat rethinkdb

#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)
  
  1. в первом элементе arry.length значение false, поэтому вы просто добавляете элемент
  2. второй элемент, который вы проверяете, если numid еще не существует -> добавить элемент
  3. нумид уже существует -> пропустить
  4. нумид уже существует -> пропустить
  5. создать нумидию -> добавить элемент

Комментарии:

1. с помощью reduce () javascript я не работаю непосредственно в rethinkdb, я работаю с результатом, например, в этом случае я хочу получить 4 элемента, но я мог получить только 3, потому что rethinkdb выдает мне один массив с 5 элементами, но некоторые элементы этого массива повторяются, я хочу, чтобы rethinkdb выдавал мне 4 элемента без повторения в массиве. Я поместил изображение в свой пост, чтобы показать больше данных о моей проблеме

2. понятно, а как насчет использования .distinct() прямо перед .limit(5) ?

3. distinc работает только тогда, когда все массивы имеют одинаковое содержимое, но для этих элементов codeQR не похожи, по этой причине distinct() ничего не делает