Сравнение операций "ключ-значение" в N1QL и запросов

Прямо сейчас я пытаюсь определить, что более эффективно для моей проблемы. Вот такая ситуация:

Постановка проблемы У меня есть массив объектов, которые я хочу обновить / вставить в свою базу данных Couchbase. Если они уже есть в базе данных, они должны обновить все поля, кроме одного. Если их нет в базе данных, их следует просто вставить. У меня есть рабочий параметризованный оператор слияния, который делает то, что я хочу, где он принимает массив объектов в качестве параметра и соответственно обновляет / вставляет. Но мне было интересно, эффективнее ли выполнить этот единственный запрос или лучше пройтись по массиву и для каждого объекта запустить операцию «ключ-значение» Get () для каждого объекта, чтобы увидеть, существует ли он в db, а затем запустить функцию insert ()?

К сожалению, у меня нет точной оценки размера массива, но я точно знаю, что это задание не будет запускаться очень часто, если это поможет. Заранее спасибо за помощь!


person jgeorge    schedule 26.08.2020    source источник
comment
Если ключи документа уже известны, используйте пары "ключ-значение" SDK. Вы также можете изучить ключ-значение UPSERT.   -  person vsr    schedule 27.08.2020
comment
@vsr Ключ-значение UPSERT уничтожит существующее поле, которое OP хочет сохранить.   -  person dnault    schedule 27.08.2020
comment
Причина, по которой я сказал upsert, заключается в том, что если они уже есть в базе данных, они должны обновить все поля, кроме одного. Если их нет в базе данных, их нужно просто вставить.   -  person vsr    schedule 27.08.2020


Ответы (1)


В общем, если вы знаете ключи, более эффективно использовать службу KV, как указал vsr.

В этом конкретном случае вы делаете что-то немного в стороне от проторенного пути, поэтому ответьте на вопрос: «Это более эффективно?» может зависеть от документов, с которыми вы работаете.

Вот кое-что, что вы могли бы попробовать с помощью службы KV. Измерьте и посмотрите, превосходит ли он запрос N1QL.

ШАГ 1. Используйте операцию вложенного документа, чтобы получить только поле, значение которого вы хотите сохранить. Если документ найден, запомните значение CAS из результата и ПЕРЕЙДИТЕ К ШАГУ 3. В противном случае ПЕРЕЙДИТЕ К ШАГУ 2.

ШАГ 2: Документа не существует, поэтому попробуйте вставить его. Если вставка прошла успешно, все готово! В противном случае, если вставка не удалась из-за того, что документ существует (документ был вставлен кем-то до вас), ПЕРЕХОДИТЕ К ШАГУ 1.

ШАГ 3: Возьмите существующее значение поля, полученное на ШАГЕ 1, и вставьте его в свой документ. Затем выполните операцию REPLACE, используя значение CAS. Если замена не удалась из-за несоответствия CAS (документ был изменен кем-то до вас), ПЕРЕХОДИТЕ К ШАГУ 1.


В качестве альтернативы ... если вы знаете, что ваш документ может иметь не более 16 полей верхнего уровня, вы можете выполнить все обновление за одну операцию над поддокументом.

person dnault    schedule 27.08.2020