2015-05-12 272 views
1

我需要通過嵌套對象過濾數據的解決方案。 所以,這是我的JSON數據:嵌套對象上的RethinkDB過濾器

{ 
"create_datetime": 1431000977 , 
"creator": { 
    "company": { 
     "id": 0 , 
     "name": "Some name" 
    } , 
    "manager": { 
     "id": 0 , 
     "name": "" 
    } 
} , 
"finished_datetime": 1431615600 , 
"id": "00949296-cbea-4d4a-a780-7c8d918a7fd6" , 
"participants": [ ], 
"status": "created" , 
"tender_categories": [ 
    1285 
] , 
"views": [ ] 
}, 
{ 
"create_datetime": 1431416740 , 
"creator": { 
    "company": { 
     "id": 70922233 , 
     "name": "Some company name" 
    } , 
    "manager": { 
     "id": 1003546168 , 
     "name": "Some manager name" 
    } 
} , 
"finished_datetime": 1432857600 , 
"id": "28e0936b-84e0-4ffc-9ad1-78a1d34e9033" , 
"participants": { 
    "788190": { 
     "creator": { 
      "company": { 
       "id": 788190 , 
       "name": "Company name" 
      } , 
      "manager": { 
       "id": 1003546168 , 
       "name": "Manager Name" 
      } 
     } , 
     "dt_applied": 1431416778 , 
     "viewed": false 
    } 
} , 
"status": "created" , 
"tender_categories": [1303] , 
"views": [788190] 
} 

我需要從這個JSON,我們有參與者選擇一個記錄,那看過。我寫了很多代碼,但其中一個工作。

r.db('test').table('tenders').filter(function(tender) { 
    return tender('participants').coerceTo('array').map(function(participant) { 
    return participant('viewed').eq(false) 
    }); 
}); 

r.db('pm').table('b2b_tenders').map(function(tender) { 
    return tender('participants').filter(function(key) { 
    return tender(key)('viewed').eq(false) 
    }); 
}); 

等一個。幫助一下。

回答

5

任何類型的嵌套對象過濾都是可行的。在你的情況下,似乎你想要所有的文件,其中所有參與者的屬性view設置爲false。

這裏是一個非常長的,尚未完成,安全檢查是這樣的方式:這個查詢的

r.db('test').table('tenders') 
    // Only get all documents with `participants` property 
    .hasFields('participants') 
    // Only get documents where the `participants` property is an object 
    .filter(function (row) { 
    return row('participants').typeOf().eq('OBJECT') 
    }) 
    // Only get documents where all participants have a `viewed` property 
    .filter(function (row) { 
    return row('participants').coerceTo('array') 
     .map(function (row) { 
     return row(1).hasFields('viewed') 
     }) 
     .distinct() 
     .eq([true]) 
    }) 
    // Only get documents where all participants have a `viewed` property set to `true` 
    .filter(function (row) { 
    return row('participants').coerceTo('array') 
     .map(function (row) { 
     return row(1)('viewed').eq(false) 
     }) 
     .distinct() 
     .eq([true]) 
    }) 

你或許可以取出或更換零件,以滿足您的需求,並根據你知道多少關於即將到來的文檔。但是,此查詢顯示如何處理嵌套屬性。