我正在尝试从 Node.js 在 couchBase 上创建用户特定的 View 。这是我的代码
app.post("/todo/:id", function(req, res){
console.log("hey" + req.body.userId)
baseview.setDesign('design_users', {
"$req.body.userId": {
'map': "function (doc, meta) { if(doc.toUserName == req.body.userId) {emit(doc.status, doc.title);}}"
}
},
function(err, result){
if (err != null) console.log(err);
else res.send(result)
}
);
})
执行以下curl
curl -H "Content-Type: application/json" -X POST -d '{"userId": "uidam231"}' http://localhost:3000/todo/id
虽然设计文档 design_users 是在 couchBase 上创建的,但预期 View (uidam231) 不是在 couchBase 上创建的。控制台上没有错误。
我怀疑 json 中变量 req.body.userId 的赋值可能是原因。请注意, View 名称 ("$req.body.userId": ) 和过滤条件 (doc.toUserName == req.body.userId) 都需要传入变量。
请问有什么建议吗?
最佳答案
不可能将变量传递给 View 中的map函数,因为map()
和reduce()
不是用来查询数据,而是用来构建索引,存储桶中数据的物化 View ,稍后您可以进行过滤、范围、排序,但基于您在构建期间(即执行映射时)选择放入该索引的键。简而言之,数据库对整个数据集运行一次映射函数,然后对每个新的/更改的文档运行一次映射函数,以更新索引。这就是为什么您无法传递或使用查询中的参数,或者在某些情况下使用 new Date()
或 Math.random()
毫无意义,因为它们在索引构建期间,每个文档的值只会评估一次,但不会在查询时评估。
在你的情况下,你应该做的是构建这样的 map 函数:
function (doc, meta) {
emit(doc.toUserName, [doc.status, doc.title]);
}
这将为您提供 View 索引,其中用户名是键,状态和标题是值。这样您就可以使用 key=
参数查询 View 并传递用户 ID。
更多信息:
关于javascript - 在 couchBase 中创建 View 时如何将输入变量设置为 json 中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40926295/