如何更新文档属性而不影响CouchDB中的其他属性?

问题描述 投票:0回答:1

我使用couchDB和PHP使用guzzle来发布,放置,获取和删除数据。发布,获取,删除工作正常但问题发生在put。当我发送更新的请求文档时,只更新了属性值,并且在文档中删除了所有其他属性。

我已经发布,删除和获取数据

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

这是put请求的代码

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"
 }
}
php couchdb guzzle guzzlehttp couchdb-2.0
1个回答
0
投票

如果要进行部分更新,可以使用更新处理程序:

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"

注意事项

正如您所看到的,更新处理程序是部分更新或更新的绝佳工具,您不希望先进行往返检索文档的往返。

警告:此方法不是冲突的,您仍然可以引入冲突。

© www.soinside.com 2019 - 2024. All rights reserved.