根据PouchDB replicate()文档,可以添加一个continuous选项Pouch.replicate():
如果为true,则开始订阅第一个数据库中的更改并将其复制到第二个数据库.
我明白这意味着什么,但它是如何运作的?我看过代码,但很难理解'订阅'是如何完成的.
背景:我有一个 mysql 数据库,我将把它移到 couchdb 中,该数据库中有一些表、“书籍”和“用户”。我通过登录表单登录到 Web 应用程序,当前在 php 脚本中发布用户名和密码,然后让用户登录并将 php 会话写入该用户的用户表。现在,当用户请求书籍时,我 a) 确保 php 会话对用户有效,然后使用登录的用户 ID 获取用户可以查看的书籍。
问题:您将如何在 couchdb 中复制这种特定于用户的记录查询?我假设 couchdb 的全部意义在于能够说http://somesite.com/couchdb/getBooks/并且该 db 端点返回书籍。
也许我只需要在最后传递一个 sessionid?http://somesite.com/couchdb/getBooks/?s=123123但是我从哪里获得会话?嗯。
任何谈论这个的方向或文章都会很棒。
是否可以管理来自客户端的同步冲突?
我的意思是,当pouchDB执行同步并检测到冲突时,是否有可能获得本地文档PouchDB正在尝试同步和CouchDB doc的最新版本?如果我可以获得这两个文档,我可以将它们显示给用户,他可以选择保留哪个版本...
我想获取 id 与正则表达式匹配的所有文档。
例如,我有以下文档 ID:
p0
p0/e0
p1
p1/e0
Run Code Online (Sandbox Code Playgroud)
我怎样才能只得到 p0 和 p1 ?正则表达式将是 /^p[0-9]+$/
目前我可以执行两个请求,但我只想使用一个:
This.db.allDocs({
include_docs: false
}).then(function(result){
// Find all ids matching /^p[0-9]+$/
var iDoc = result.rows.length;
while(iDoc--){
if(result.rows[iDoc].id.match(/^p[0-9]+$/)){
projectsIds.push(result.rows[iDoc].id);
}
}
// Get all documents with ids matching /^p[0-9]+$/
This.db.allDocs({
include_docs: true,
keys: projectsIds
}).then(function(result) {
var iProject = result.rows.length;
var docs = [];
while (iProject--) {
docs[iProject] = result.rows[iProject].doc;
}
projects.resolve(docs);
});
});
Run Code Online (Sandbox Code Playgroud) 在Pouchdb中,什么是处理多个数据集合的最佳方法?我的意思是,例如,我需要多个待办事项列表,而不是简单的待办事项列表,例如:待办事项,工作待办事项,社区待办事项和生态待办事项.
我应该将它全部放在一个数据库中,并在每个文档中使用一个键来确定它属于哪个列表?或者我应该使用不同的数据库?在我的应用程序中,用户将能够自由地创建和删除这些数据集合(或示例中的待办事项列表).
谢谢你,Marcio Moreira
我在电子应用程序上使用pouchDb.在传递给pouchDb之前,数据存储在postgres数据库中.在某些情况下,要弄清楚如何以文档方式构建数据并不难.
我主要担心的是关系.例如:
我有数据类型项目,项目有很多事件.现在我在每个事件上都有一个名为project_id的字段.因此,当我想要获得ID为'project/1'的项目的事件时,我会这样做
_db.allDocs({
include_docs: true,
startkey: 'event',
endkey: 'event\uffff'
}).then(function(response){
filtered = _.filter(response['rows'], function(row){
return row['doc']['project_id'] == 'project/1'
});
result = filtered.map(function(row){
return row['doc']
})
});
Run Code Online (Sandbox Code Playgroud)
我已经读过这allDocs是性能最好的API,但是,在这种情况下是否有更方便的视图?
另一方面,当我显示包含所有项目的列表时,每个项目都需要显示它具有的事件数.在这种情况下,我似乎必须再次运行allDocs,include_docs: false以便计算项目所具有的事件数.
有观点会改善这种情况吗?
另一方面,我正在考虑在Project文档中创建一个包含所有事件ID的数组,以便我可以轻松计算它有多少事件.在这种情况下,我应该使用allDocs吗?有没有办法将ID数组传递给allDocs?或者更好的是在该数组上使用循环并为每个id调用get(id)?
这种方式比第一种更有效吗?
谢谢!
我正在尝试构建一个包含以下内容的拓扑:
通过局域网连接的两个桌面运行本机应用程序。
同一应用的网络版本。
台式机只能间歇性地连接到Internet,因此本机应用程序和Web应用程序都需要具有单独的数据存储,这些数据存储在联机时会同步。
为此,我发现了ouchdb,它似乎是理想的候选人。我正在Electron上构建桌面应用程序,因此我考虑与其一起使用pouchdb并在联机时将其与服务器服务器上的couchdb同步。
但是问题是,这两个运行带有pouchdb的Electron应用程序的台式机将需要通过LAN彼此同步。pouchdb是否提供与远程pouchdb同步的功能?我只看到同步袋和沙发的文档。
https://pouchdb.com/guides/databases.html
我真的是数据库之间同步的概念的新手。Dunno,如果我要提出明显的(或显然不可能的)问题。感谢帮助。
我使用 pouchdb 和 couchDb 作为我的离线第一个带有 react 的移动应用程序的数据库。
https://pouchdb.com/2015/04/05/filtered-replication.html
基于以上,就像我配置了 pouchdb 并与 couchdb 同步。我正在做基于用户的过滤。当用户注销并再次登录时,db 值可用。做到这一点的最佳设计方法是什么?
有什么例子可以参考吗?
configurePouchdb(user) {
var db = new PouchDB('dbname', {adapter: 'websql'});
var serverSideFilter = {
_id: "_design/app",
filters: {
"by_user": function (doc, req) {
return doc._id === '_design/app' || (doc.userId != undefined && doc.userId === req.query.userId);
}.toString()
}
};
db.put(serverSideFilter).then(function (doc) {
// design doc created!
}).catch(function (err) {
// if err.name === 'conflict', then
// design doc already exists
});
db.sync('http://127.0.0.1:5984/dbname', {
live: true,
retry: true, …Run Code Online (Sandbox Code Playgroud) 我在pouchdb中有一些数据,我想在pouchdb中显示总行数,我该怎么办?
angular.module("pouchapp", ["ui.router"])
.run(function($pouchDB) {
$pouchDB.setDatabase("dbinfo");
//console.log($pouchDB.length); //show total rows in pouchdb
});
.service("$pouchDB", ["$rootScope", "$q", function($rootScope, $q) {
var database;
this.setDatabase = function(databaseName) {
database = new PouchDB(databaseName);
}
}]);
Run Code Online (Sandbox Code Playgroud) 我有一个本地的pouchDB任务。直到我尝试设置与IBM Cloudant noSQL的同步之前,它都运行良好。到目前为止,主要的问题在于remove()方法,我这样编写:
$(document).on("click","#taskList li .delete", function(){
db.remove(id,rev);
refreshTasks();
});
Run Code Online (Sandbox Code Playgroud)
当关闭同步后,该方法可以完美工作,但是一旦我激活以下各行的同步,就不会从本地和远程删除任务。我正在运行PouchDB与以下代码同步:
db.sync(remote_db, {
live: true,
retry: true
}).on('change', function (change) {
// yo, something changed!
}).on('paused', function (info) {
// replication was paused, usually because of a lost connection
}).on('active', function (info) {
// replication was resumed
}).on('error', function (err) {
// totally unhandled error (shouldn't happen)
});
Run Code Online (Sandbox Code Playgroud)
我的数据库就是这样创建的:
var db = new PouchDB('tasks', {revs_limit: 1, auto_compaction: true});
Run Code Online (Sandbox Code Playgroud)
现在,当我创建revs_limit为0的数据库时,它将再次工作。
可能会发生什么?