javascript - 在 couchBase 中创建 View 时如何将输入变量设置为 json 中的键

标签 javascript json node.js couchbase couchbase-view

我正在尝试从 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。

更多信息:

  1. Querying Data with Views
  2. MapReduce Views

关于javascript - 在 couchBase 中创建 View 时如何将输入变量设置为 json 中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40926295/

相关文章:

node.js - 我的机器上没有安装 Express

javascript - 尝试为 jQuery AJAX 请求添加延迟

javascript - 在 AngularJS 中的 NgRepeat 指令内获取用户输入

javascript - 仅在 for 循环中迭代一次特定代码

node.js - 将查询数据从函数返回到 james/express.js 页面

javascript - 简单的 require.extensions 示例不起作用

javascript - 将 'display none' 换成淡出

javascript - 为什么我的 "message.reply"不起作用(Discord.JS)

java - 使用与appengine服务器兼容的java为android客户端开发webservice(json格式)

javascript - 检查 json 对象中是否存在复选框