ionic 2 couchdb pouchdb:如何获取尚未同步的数据

时间:2016-07-25 11:55:01

标签: ionic-framework ionic2 couchdb pouchdb nosql

我有一种感觉,我面临的问题是一些愚蠢的简单基本的事情,但我仍然无法弄明白。

我有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,因为此文件也会有用户注释。

0 个答案:

没有答案