我有一个CouchDB,它可以在我的应用程序中同步到PouchDB。我收到的文档有一些设置值,但很多值可能是由代码的其他部分添加的,我不能确定不知道是哪一个。例如
{
"_id": "document-1",
"_rev": "1-967a00dff5e02add41819138abb3284d"
"myData": "AB",
"SomeStuffIdidnotKnow": "1234"
}
因此,在某一点上,我必须更改一个特定的值,我认为最简单的方法是这样做:
myDB.get("document-1").then(function (doc) {
doc.myData = "ABC";
return CongressData.db.put({
doc
}).then(function (response) {
console.log(response);
}).catch(function (err) {
console.log(err);
});
});
但是这总是抛出一个错误412〃;missing_id";。我当然知道
return CongressData.db.put({
_id: doc.id,
_rev: doc._rev,
myData: "ABC"
});
会起作用。但由于我不能说其他元素是什么,所以要弄清楚会很乏味。
难道不可能以某种方式将一个包含_id an_rev的变量直接传递给put
吗?
如果我理解正确,您的问题是属性名称不一致。
您可以简单地循环遍历对象并转换需要转换的关键帧。您可能需要执行相反的操作,因此建议使用参数化函数:
const couchify = convertKeys(key => to[key] || key);
const to = { id: '_id', revision: '_rev' };
const convertKeys = f => doc => Object.fromEntries(
Object.entries(doc).map(([key, value]) =>
[ f(key), value ]));
您可以有一个包含此类问题修复程序的模块,该模块导出put
函数,以及其他需要转换的操作:
export const put = (db, doc) => db.put(couchify(doc))
并用它代替库存CCD_ 3方法:
import { put } from 'couchDBAdapter.js';
myDB.get("document-1")
.then(doc => put(CongressData, {...doc, myData: "ABC"}))
.then(console.log, console.error);
如果这更符合你的风格,你也可以把你的数据库封装在一个类中,但我不建议让这种东西在你的代码中到处出现,因为你可能想在某个时候把CouchDB换成其他东西。
我没有测试这个代码。