GET {db}/_design/{ddoc}
によって返されたオブジェクトは、PUT要求でサーバーに返されたときにビューを無効にするビューの 'map'値に追加の検証構文を多数挿入します。例えば同期ゲートウェイクエリPUTはGETと互換性がありません
:
PUT {db}/_design/{ddoc}
{'views':
{'_test':
{'map':
'function(doc, meta) { if (doc.uid == "test1") { emit(null, null); } }'
}
}
}
が作成:
GET {DB}/_設計/ {DDOC}
{
'views': {
'_test': {
'map': 'function(doc,meta) {\n\t\t
var sync = doc._sync;\n\t\t
if (sync === undefined || meta.id.substring(0,6) == "_sync:")\n\t\t
return;\n\t\t
if ((sync.flags & 1) || sync.deleted)\n\t\t
return;\n\t\t
var channels = [];\n\t\t
var channelMap = sync.channels;\n\t\t\t\t\t\t\t
if (channelMap) {\n\t\t\t\t\t\t\t\t
for (var name in channelMap) {\n\t\t\t\t\t\t\t\t\t
removed = channelMap[name];\n\t\t\t\t\t\t\t\t\t
if (!removed)\n\t\t\t\t\t\t\t\t\t\t
channels.push(name);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t
delete doc._sync;\n\t\t
meta.rev = sync.rev;\n\t\t
meta.channels = channels;\n\n\t\t
var _emit = emit;\n\t\t
(function(){\n\t\t\t
var emit = function(key,value) {\n\t\t\t
\t_emit(key,[channels, value]);\n\t\t\t
};\n\t\t\t\t\t\t\t\t
(function(doc, meta) { if (doc.uid == "test1") { emit(null, null); } }) (doc, meta);\n\t\t\t\t\t\t\t
}());\n\t\t\t\t\t\t\t
doc._sync = sync;\n\t\t\t\t\t\t}'
}
}
}
}
そして、この新たなオブジェクトが返された場合に後続の設計文書PUT要求では、ビューは有効ではなく、実質的に排除される。
これは、関連する以前のすべてのビューを削除せずにデザインビューアを新しいビューで更新しようとすると、問題が発生します。更新された設計ドキュメントを再提出する前に、すべての(ユーザー定義の)ビュー定義をどこかに格納するか、GETによって返されたオブジェクトを解析してすべての迷惑コードを削除する必要があります。
これは意味があります。私の場合は、GETとPUTの両方がSync Gatewayポート経由で呼び出されます。だから、私はあなたの推奨されたアプローチを使用しています...要求が直接CSに行った場合に違いが出ますか? –
私は元の問題を理解していないかもしれませんが、あなたが見ている問題を再現するカールステートメントのシーケンスを投稿できますか?それらが長すぎてSOに直接投稿できない場合は、要点またはペーストビンに入れてもいいですか? – tleyden