Как я могу обновить атрибут документов без влияния другого атрибута в CouchDB? - PullRequest
0 голосов
/ 04 апреля 2019

Я использовал couchDB с PHP, используя жадность для публикации, размещения, получения и удаления данных.пост, получить, удалить работает нормально, но проблема возникает в пут.Когда я отправляю документ запроса на добавление, обновляются только обновленные значения атрибутов, а все остальные атрибуты удаляются в документе.

Я уже делаю пост, удаляю и получаю данные

$response = $client->post(
 "/child_installed_apps/_find",
[GuzzleHttp\RequestOptions::JSON => ['selector' =>  
['parent_id' => ['$eq' => $userid], 'child_device_id' => ['$eq' =>    
$deviceId], 'package_name' => ['$eq' => $packageName]],]]);

Вот кодзапрос на поставку

foreach ($documents['docs'] as $doc) {
    $result = $client->PUT(
   "/child_installed_apps/" . $doc['_id'] . '?rev=' .  
   urlencode($doc['_rev']), ['body' =>  json_encode($app_detail)]);
}

До запроса на поставку документа, как это:

{
   "id": "1dde9f973b42136c1921bb84d2bca33a",
   "key": "1dde9f973b42136c1921bb84d2bca33a",
   "value": {
   "rev": "1-3ee7bd67f3552f68f7a7c4e4c8b2278f"
},"doc": {
  "_id": "1dde9f973b42136c1921bb84d2bca33a",
  "_rev": "1-3ee7bd67f3552f68f7a7c4e4c8b2278f",
  "parent_id": "PV-407",
  "child_device_id": "2525252525",
  "app_name": "IMDb Movies & TV",
  "app_category": "Entertainment",
  "app_icon": "https://lh3.googleusercontent.com    
  /IKW5EWVX4qUYF6LPP1_O1sWiZsMblSQVnBrtkMAd07Br69lEApDez9yzFe09iAgJAg=s180-rw",
  "package_name": "com.android.imdb",
  "app_status": "0",
  "all_block_app_status": "0",
  "timely_status": "0",
  "monday": "00:00",
  "tuesday": "00:00",
  "wednesday": "00:00",
  "thursday": "00:00",
  "friday": "00:00",
  "saturday": "00:00",
  "sunday": "00:00",
  "app_datetime": "2019-01-15 17:20:46"
}

и после запроса документа, как это:

{
   "id": "378647beffcb869ab4ad831196666059",
   "key": "378647beffcb869ab4ad831196666059",
   "value": {
   "rev": "4-949230091e577dc3d89725836d35a71b"
  },"doc": {
     "_id": "378647beffcb869ab4ad831196666059",
   "_rev": "4-949230091e577dc3d89725836d35a71b",
   "app_status": "1"
 }
}

1 Ответ

0 голосов
/ 13 апреля 2019

Если вы хотите сделать частичные обновления, вы можете использовать обработчик обновлений:

https://docs.couchdb.org/en/latest/ddocs/ddocs.html#update-functions

Шаг 1. Создайте проектный документ с помощью обработчика обновлений

Следующий обработчик обновлений обновит свойство status документа и установит для свойства updated_at текущее время.

{
  "_id": "_design/myDesign",
  "updates": {
    "setStatus": "function(doc, req) {
                    // Use JSON.parse(req.body) if you use POST
                    doc.status = req.query.status
                    doc.updated_at = new Date().toISOString()
                    doc.updated_by = req.userCtx.name
                    return [doc, "Status was set to " + doc.status_]
                  }"
  }
}

Шаг 2. Вызов обработчика обновлений

GET /db/_design/myDesign/_update/setStatus/my_doc?status="NEW STATUS"

// Returns: "Status was set to NEW STATUS"

Предостережения

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

Предупреждение: этот метод не является конфликтным, и вы все равно можете создавать конфликты.

...