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

Aus*_*vis 6 mongoose query-string express angularjs

这是我试图转换为查询字符串的javascript对象

{$and: [{topic: categoryIds} , {$or :[ {'groups 1': {$ne: ''}}, {groups: $scope.myGroups}]}]};
Run Code Online (Sandbox Code Playgroud)

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

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

pot*_*lad 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;
  }
})
Run Code Online (Sandbox Code Playgroud)

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

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

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