Условный апсерт в Couchbase - PullRequest
       7

Условный апсерт в Couchbase

2 голосов
/ 14 февраля 2020

У меня есть документы, которые выглядят так:

{
"name": "n",
"age": 22
//other properties

"hash": "XyRZHDJJD6738..." //This property contains the hash of the object (calculated by the client)
}

От клиента я должен:

  • Обновить документ, используя его ключ (известный) , ТОЛЬКО если ха sh отличается (=> Сохраненный объект и новый объект не совпадают)

  • Вставьте документ, если ключ не не существует

Эта операция выполняется в массовом режиме на относительно большом наборе данных с одновременным доступом => Таким образом, выбор документа, затем обновление не вариант.

Есть ли способ сделать это в Couchbase (5.1 +)?

1 Ответ

2 голосов
/ 17 февраля 2020

С настройкой модели документа вы можете получить что-то вроде этого:

{
    "name": "n",
    "age": 22,
    "applied_hashes": {
        "XyRZHDJJD6738": null,
        "AB2343DCxdsAd": null,
        // ... other hashes
    }
}

Теперь вы можете выполнять каждое обновление как операцию с дополнительным документом, с первой попыткой c. и вставьте ха sh обновления в apply_hashes. Если этот хеш / обновление был ранее применен, то эта вставка завершится неудачно, и, поскольку Поддокумент имеет атомарный характер c, в документ не будут внесены изменения.

С Java SDK 3.x this выглядит так:

try {
  collection.mutateIn("id",
          Arrays.asList(
                  MutateInSpec.insert("applied_hashes.XyRZHDJJD6738", null).createPath(),
                  MutateInSpec.upsert("age", 24)
                  // .. other parts of update XyRZHDJJD6738 here
          ));
}
catch (PathExistsException err) {
  // Update XyRZHDJJD6738 has already been applied
  // No changes have been made to the document
}
...