我有一种感觉,我面临的问题是一些愚蠢的简单基本的事情,但我仍然无法弄明白。
我有couchdb服务器,有数千个文件。类别为类别:主题和类型:测验。基本主题文档包含测验文档ID列表,类型测验文档包含问题和答案
示例:主题文档
{
"_id": "topic-57913023930b4",
"_rev": "1-1b8968c43bacffa849fab9bc62fbe910",
"name": "Programming Languages",
"type": "topic",
"pid": "topic-57913023930b4",
"totalQuiz": 19,
"quiz": [
{
"id": "quiz-5790b7035f496"
},
{
"id": "quiz-5790b7fbacc8e"
},
{
"id": "quiz-5790b3291766d"
},
{
"id": "quiz-5790afc077f64"
}
]
}
示例:测验文档
{
"_id": "quiz-5790a476e184c",
"_rev": "1-48acc3b900b6010cf3d527fcf26f8e0c",
"question": "this is a question",
"correctanswer": 0,
"answers": [
"option 1",
"option 2",
"option 3",
"option 4"
]
}
现在将服务器数据库同步到本地数据库。如果我同步整个数据库,那么我的本地数据库如下:
this.db = new PouchDB('mydb');
this.remote ='http://IP_ADDRESS:5984/mydb';
let options = {
live: true,
retry: true,
continuous: true
};
this.db.sync(this.remote, options);
然后我的本地数据库将在几分钟内变得庞大,因为我的服务器包含数千个文档。我希望避免这种情况,并仅按需下载文件。我不知道该怎么做
如果我使用一些基本的过滤器来开始只提取类型为:subject的文档,如下所示:
this.db = new PouchDB('mydb');
this.remote ='http://IP_ADDRESS:5984/mydb';
let options = {
live: true,
retry: true,
continuous: true,
filter: function (doc) {
return doc.type === 'topic';
}
};
this.db.sync(this.remote, options);
如果我在上面做,那么只有主题文件被拉,但我根本没有访问测验文件。也许我需要禁用同步并找出一种只按需下载数据的方法。不知道如何做到这一点:(
但是无论如何我甚至让整个数据库在构造函数中自动同步。仍然需要花时间将数据库复制到本地数据库。
让我们在应用程序的主页上说我想从文档ID:“_ id”:“topic-57913023930b4”中显示一个主题“Programming Languages”。因为我做了这个代码
ionViewLoaded(){
this.DataService.getDocument('topic-57913023930b4').then((result) => {
this.data = result;
});
}
在我的服务中我有这段代码:
getDocument(id) {
return new Promise(resolve => {
this.db.get(id).then((result) =>{
this.data=result;
resolve(this.data);
}).catch((error) => {
console.log(error);
});
});
}
但是,当应用程序启动时,它还没有提取所有这些文件,所以我的本地数据库没有id为'topic-57913023930b4'的文档。如果依赖构造函数的数据同步代码,可能需要几分钟才能获得该文档。
所以我需要一种方法来在此时从couchdb服务器中提取这些数据。但我不知道该怎么做。虽然我知道可以使用HTTP请求,但它不会与pouchdb本地数据库同步。
请指导我正确的方向。我一直试图让这个工作从昨天开始,但无法解决这个问题。
正如AlexisCôté所建议的那样:
虽然我可能必须将本地数据库同步到服务器数据库,但我仍然在研究你建议的想法: 即如果本地存储器没有数据,我将直接对文档发出http请求并获取数据。然后将该数据存储在pouchdb中。
fetchDoc(id){
return new Promise(resolve => {
this.db.get(id).then((result) =>{
this.data=result;
resolve(this.data);
}).catch((error) => {
console.log('data is not in the PouchDB yet. so calling HTTP REQUEST');
this.data=this.httpRequest(id);
console.log(this.data);
resolve(this.data);
});
}
httpRequest(id){
let url='http://ip_address:5984/mydb/"+id;
return new Promise(resolve => {
console.log('fetchin url :'+url);
this.http.get(url)
.map(res => res.json())
.subscribe(data => {
this.data = data;
resolve(this.data);
});
});
}
这会立即给我数据。 但是在获取此数据之后,如果我尝试将此数据存储在pouchdb中,那么我会收到此错误“缺少_ID” 当我打印从httRequest函数返回的数据给我这个奇怪的对象
ZoneAwarePromise {__zone_symbol__state: null, __zone_symbol__value: Array[0]}
现在我正在努力应对这个ZoneAwarePromise :(以及如何正确地将数据存储在pouchdb中。
我必须将此文件同步回couchdb,因为此文件也会有用户注释。