假设我们在PouchDB中存储了表示为JSON对象的汽车(大约40MB),我们希望根据马力属性进行搜索。 sql中的示例:select * from cars in HP> 100.
您可以按键查询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);
}
}
那么有可能查询数据库,根据非关键变量进行参数化吗?
答案 0 :(得分:8)
从PouchDB 2.0.0开始,支持map / reduce查询中的闭包。 Details here
但是,如果可以,你应该避免使用它们,因为
话虽如此,如果你想使用闭包,你现在可以这样做:
var horsePower = $scope.horsePowerInputField
function(doc, emit) { // extra 'emit' tells PouchDB to allow closures
if(doc.hp > horsePower) {
emit(doc.value, null);
}
}
答案 1 :(得分:3)
你的map
函数失去了它的闭包,因为它在PouchDB内部被重新评估(这就是它获取emit
函数的方式)。这意味着您无法从代码中访问任何变量,但您仍然可以查询数据库。
在PouchDB中,视图不是持久的,因此您的查询始终会查看数据库中的每个文档,并且必须在 map函数之后进行过滤。像这样:
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)
}
是解决这个问题的一种方法。 Pouch将遍历每个文档,并将其传递给您的map
函数。完成后,将使用所有已发布文档的数组调用filter
。 filter
不会丢失其闭包上下文,因此您可以根据马力或此处的任何其他字段过滤结果。
答案 2 :(得分:1)
最好不要使用闭包。这样做:
var horsePower = $scope.horsePowerInputField;
db.query(function(doc) {emit(doc.hp)}, {startkey: horsePower, include_docs: true});
答案 3 :(得分: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');