【问题标题】:Couchbase ViewQuery array range doesn't work (node.js sdk)Couchbase ViewQuery 数组范围不起作用(node.js sdk)
【发布时间】:2016-01-04 09:23:43
【问题描述】:

我有一个以 couchbase 作为数据库的 express 应用程序,并且有一个这样的 express 路由器:

router.get('/:key', function(req, res, next){
  var champId = req.params.key;
  var startKey = [champId, 0, false];
  var endKey = [champId, 100000, true];
  var input = {
    'bucket' : dbbucket,
    'document' : dbdocument,
    'view' : dbview,
    'viewStartKey' : startKey,
    'viewEndKey' : endKey,
    'inclusiveEnd' : true,
    'groupLevel' : 3
  };

  dbconnect.dbQuery(input, function(dbError){
    res.status(500).send('Could not retrieve the requested data');
  }, function(results) {
    res.status(200).send(results);
  });
});

router.get('/', function(req, res, next){
  var input = {
    'bucket' : dbbucket,
    'document' : dbdocument,
    'view' : dbview,
    'groupLevel' : 3
  };

  dbconnect.dbQuery(input, function(dbError){
    res.status(500).send('Could not retrieve the requested data');
  }, function(results) {
    res.status(200).send(results);
  });
});

我的 dbQuery 方法是:

function queryExecuter (input, error, callback){
  var constructedQuery = queryConstructor(input.document, input.view);
  if(input.viewKey){
    constructedQuery = constructedQuery.key(input.viewKey);
  }
  if(input.viewStartKey && input.viewEndKey && input.inclusiveEnd){
    constructedQuery = constructedQuery.range(input.viewStartKey, input.viewEndKey, input.inclusiveEnd);
  }
  if(input.groupLevel){
    constructedQuery = constructedQuery.group_level(input.groupLevel);
  }
  input.bucket.query(constructedQuery, function(dbError, results) {
    if(dbError) {
      error(dbError);
      return;
    }
    callback(results);
  });
}

当我尝试在没有 startKey 和 endKey 的情况下运行时,数据返回正常,但是当我使用 startKey 和 endKey 运行时,我得到一个空数组作为响应(我应该得到 159 条记录,因为这是我得到的数据量在没有 startKey 和 endKey 的情况下运行,当我从 couchbase 控制台查询具有相同 startKey 和 endKey 的存储桶时,这就是我得到的)。我正在使用 nodejs 版本 4.2.1 和 couchbase 版本 4.1.0。我还尝试使用 startKey.toString() 和 endKey.toString()。结果还是一样。

【问题讨论】:

  • 在输入dbconnect.dbQuery 方法之前,您能否通过console.log 验证input 变量是否包含您所期望的内容?查看一些示例数据和完整的示例请求也会有所帮助。将有助于排除故障点。

标签: node.js couchbase


【解决方案1】:

事实证明,当我点击 /:key 路由时,我生成的 startKey 和 endKey 将是 [ '1', 0, false] 和 [ '1', 10000, true] 而不是 [ 1, 0, false] 和 [1, 10000, true]。

所有尝试使用此类路由的人请注意:始终使用 parseInt(req.params.key)。

工作代码:

router.get('/:key', function(req, res, next){
  var champId = req.params.key;
  var champIdInt = parseInt(champId);
  var startKey = [champIdInt, 0, false];
  var endKey = [champIdInt, 100000, true];
  var input = {
    'bucket' : dbbucket,
    'document' : dbdocument,
    'view' : dbview,
    'viewStartKey' : startKey,
    'viewEndKey' : endKey,
    'inclusiveEnd' : true,
    'groupLevel' : 3
  };

  dbconnect.dbQuery(input, function(dbError){
    res.status(500).send('Could not retrieve the requested data');
  }, function(results) {
    res.status(200).send(results);
  });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2016-07-13
    • 2015-07-07
    • 2020-02-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    相关资源
    最近更新 更多