在 php 中从 couchdb 中清除已删除的文档

purge deleted documents from couchdb in php

我正在尝试通过 couchdb 为 运行 编写一个自动化脚本,找到已删除的文档(每月约 100,000 个文档删除)并清除它们及其修订。

我没有找到说明如何获取所有已删除文档及其所有修订并将它们构建到此处显示的 POST 请求中的文档。

http://docs.couchdb.org/en/stable/api/database/misc.html

如何构造视图、获取数据并创建 POST 来执行此操作?

谢谢

所以我最终为它制作了一个定期 运行s 的 nodejs 脚本。 有些东西是硬编码的,因为这是为了测试,而不是生产(还)。任何引用此内容的人都应该注意硬编码引用。 我使用 pouchdb 来处理复制,因为它能够在几分钟内 运行 所有 400,000 个墓碑,而在 运行 宁一整天后,我实际上从未让 couchdb 完成复制。 这是我有史以来的第一个节点脚本,如果它很糟糕,我深表歉意。

var PouchDB = require('pouchdb');
var fs = require('fs');
var child = require('child_process');

var originalDB = "dbName";
var tempDB = "dbName_clean";
var serviceName = "Apache CouchDB";
var couchDBDataPath = "C:\bin\couchdb\couchdb.2.1.1\data\";

var db = new PouchDB('http://URL/' + originalDB);
var db2 = new PouchDB('http://URL/' + tempDB);

console.log("Compacting");
return db.compact().then(function (result) {
    console.log("Compacting done, replicating");
    var batch_size = 100; 

    return db2.destroy().then(function () {
        db2 = new PouchDB('http://URL/' + tempDB);
        return db.replicate.to(db2, {
            batch_size: batch_size,
            filter: function (doc, req) {
                return !doc._deleted;
            }
        }).on('change', function (info) {
            console.log("batch done");
        }).on('complete', function () {
            console.log('complete');
        }).on('paused', function (err) {
            // replication paused (e.g. replication up to date, user went offline)
            console.log("paused", err);
        }).on('active', function () {
            // replicate resumed (e.g. new changes replicating, user went back online)
            console.log("Active");
        }).on('denied', function (err) {
            // a document failed to replicate (e.g. due to permissions)
            console.log("Denied", err);
        }).on('error', function (err) {
            // handle error
            console.log("error", err);
            // reject(err);
        }).then(function () {
            //replicate done, rename everything
            var date = new Date();
            console.log("Stopping service");
            child.execSync('net stop "' + serviceName + '"');
            console.log("Service Stopped");
            var newName;
            var counter = 0;
            do {
                newName = "_" + date.getFullYear() + date.getMonth() + date.getDay() + "_" + counter;
                counter++;
            } while (fs.existsSync(couchDBDataPath + originalDB + newName + ".couch") || fs.existsSync(couchDBDataPath + "." + originalDB + "_design" + newName));


            console.log("Renaming original couch to backup labeled", originalDB + newName);
            fs.renameSync(couchDBDataPath + originalDB + ".couch", couchDBDataPath + originalDB + newName + ".couch");
            fs.renameSync(couchDBDataPath + "." + originalDB + "_design", couchDBDataPath + "." + originalDB + newName + "_design");

            console.log("Renaming clean couch back to original", tempDB);
            fs.renameSync(couchDBDataPath + tempDB + ".couch", couchDBDataPath + originalDB + ".couch");
            fs.mkdirSync(couchDBDataPath + "." + originalDB + "_design"); 

            console.log("Starting service");
            child.execSync('net start "' + serviceName + '"');
            console.log("Service started");
        });
    });
}).catch(function (err) {
    console.log(err);
});