2013-12-22 93 views
6

假設我們將表示爲JSON對象的汽車(大約40MB)存儲在PouchDB中,並且我們希望根據horsepower屬性進行搜索。 sql中的示例:select * from HP where HP> 100.使用參數PouchDB查詢

您可以通過鍵查詢pouchDB,但顯然HP不是文檔的關鍵。有沒有辦法做到這一點?

據我明白地圖功能,

function(doc) { 
    if(doc.value) { 
    emit(doc.value, null); 
    } 
} 

,不可能給該函數的外範圍內訪問的任何變量。

var horsePower = $scope.horsePowerInputField 

function(doc) { 
    if(doc.hp > horsePower) { 
    emit(doc.value, null); 
    } 
} 

那麼是否有可能查詢數據庫,基於非關鍵變量進行參數化?

回答

3

你的map函數失去了它的封閉性,因爲它在PouchDB中被重新評估(這就是它得到emit函數的方式)。這意味着你不能從你的代碼中訪問任何變量,但你仍然可以查詢數據庫。

在PouchDB中,視圖並不是永久的,因此您的查詢總是查看數據庫中的每個文檔,並且您必須在之後執行映射函數後的過濾。像這樣的:

function findCars(horsePower, callback) { 
    // emit car documents 
    function map(doc) { 
    if(doc.type == 'car' && doc.value) { 
     emit(doc.value, null); 
    } 
    } 

    // filter results 
    function filter(err, response) { 
    if (err) return callback(err); 

    var matches = []; 
    response.rows.forEach(function(car) { 
     if (car.hp == horsePower) { 
     matches.push(car); 
     } 
    }); 
    callback(null, matches); 
    } 

    // kick off the PouchDB query with the map & filter functions above 
    db.query({map: map}, {reduce: false}, filter) 
} 

是解決這個問題的一種方法。郵袋將遍歷每個文檔,將它傳遞給您的map函數。完成後,filter被調用一個所有發射文件的數組。 filter不會丟失其關閉上下文,因此您可以在此基於馬力或任何其他字段篩選結果。

0

您可以在地圖中使用全局變量招

var getTimesheetId = ''; //global Variable 
var getOfflineTimesheet= function(documentId){ 
getTimesheetId = documentId; // assigning the value of the parameter to the global variable 


var map= function(doc){ 
     if(doc.timesheet){ 
      console.log(getTimesheetId); // here the map function is able to get the value of the global variable, which is essentially the parameter. 
      if (doc._id == getTimesheetId){ 
       emit(doc._id, doc.timesheet); 
      } 
     } 
    }; 

db.query({map: map}, function(err, res){ 
     if(!err){ 
      var out= ""; 
      res.rows.forEach(function(element){ 
       console.log(element.value); 
      }); 

     } 
    }) 
    }; 

而且你的方式將它稱爲是

getOfflineTimesheet('timesheet1DocId'); getOfflineTimesheet('timesheet2DocId'); getOfflineTimesheet('timesheet3DocId');

8

截至PouchDB 2.0.0,關閉/減少查詢的支持。 Details here

然而,你應該,如果你能避免他們,因爲

  1. 他們不是通過CouchDB的,只有PouchDB
  2. Saved map/reduce views,這是更快,可能會在2.1.0中加入支持,無法支持關閉。

話雖這麼說,如果你想使用閉包,現在你可以這樣做:

var horsePower = $scope.horsePowerInputField 

function(doc, emit) { // extra 'emit' tells PouchDB to allow closures 
    if(doc.hp > horsePower) { 
    emit(doc.value, null); 
    } 
} 
1

這是最好不要使用倒閉。代之以:

var horsePower = $scope.horsePowerInputField; 
db.query(function(doc) {emit(doc.hp)}, {startkey: horsePower, include_docs: true});