无法将复杂的javascript对象转换为查询字符串

时间:2014-08-25 18:00:17

标签: angularjs express mongoose query-string

以下是我尝试转换为查询字符串

的javascript对象
{$and: [{topic: categoryIds} , {$or :[ {'groups 1': {$ne: ''}}, {groups: $scope.myGroups}]}]};

基本上我希望匹配一个等于categoryIds的主题并抓取具有空组数组的文档,或者groups数组具有值并匹配数组中的一个$ scope.mygroups

我的问题是以易于解析的格式转换它的最佳做法是什么,以便我可以将它附加到GET请求,以及如何在快速服务器上解析它。

2 个答案:

答案 0 :(得分:0)

我在生产中使用此代码来查询具有MongoDB后端的服务器(使用angular和lodash):

.factory('mongoQuery', function() {
  return {
    fromJson: function(json) {
      return JSON.parse(json, fromJsonReviver);
    },
    toJson: function(object) {
      return JSON.stringify(object, toJsonReplacer);
    }
  };

  function fromJsonReviver(key, value) {
    var val = value;
    if (_.isPlainObject(value)) {
      if (_.isNumber(value.$date)) {
        val = new Date(0);
        val.setUTCMilliseconds(value.$date * 1000);
      } else if (_.isString(value.$regexp)) {
        var match = /^\/(.*)\/([gimy]*)$/.exec(value.$regexp);
        val = new RegExp(match[1], match[2]);
      }
    }
    return val;
  }

  function toJsonReplacer(key, value) {
    var val = value;
    if (_.isPlainObject(value)) {
      val = _.extend({}, value);
      for (var k in value) {
        val[k] = toJsonReplacer(k, val[k]);
      }
    } else if (_.isDate(value)) {
      val = {$date: (new Date(value)).valueOf() / 1000};
    } else if (_.isRegExp(value)) {
      val = {$regexp: value.toString()};
    }
    return val;
  }
})

它包含了评论中其他人提到的许多建议,并支持日期和正则表达式。

除此之外,如果您需要使用GET请求发送查询,请像其他人提到的那样使用encodeURIComponent

以下是一个工作示例:http://plnkr.co/edit/b9wJiUkrHMrDKWFC1Sdd?p=preview

答案 1 :(得分:0)

您在这里的想法基本上是重新开发API服务器,再加上一些mongodb数据库,并以某种格式查询它。

  1. REST 是" 最佳做法"你正在寻找。它是一种将一些常见操作封装到http资源的标准。
  2. 您应该知道,您不需要根据这样的标准重新开发生态系统。存在功能齐全的REST API服务器,有些甚至基于express.js。 Loopbacksails.js。这些提供了一些额外的功能,如
    • 通过ORM进行模型抽象,以及数据库引擎agnostism
    • 自动REST动作,来自数据库模式或模型创建
    • 高级查询"扩展REST" ("其中","限制","订单",...)
    • 使用类似REST的websockets实时
    • 可帮助您查询服务器的客户端库
  3. 一些独立的exernal库,例如js-dataRestangular可以很好地处理REST服务器,并充当后端的前端连接器
  4. 现在,如果我必须纯粹回答您的问题,并且您真的想要使用您的解决方案,我只需将mongo查询添加到http调用上的where查询参数{ {1}}如前所述。