将JSON查询stringparsing为JSON对象

API上的查询结构如下所示:

../myapi/products?_q=genre,retail_price&_a=g,p&p.gt=10&p.lt=20&g.eq=POP 

有两个数组:_q列出查询参数,_a列出相应的别名。 所以p – > retail_price和g – >stream派

我可以parsing为:

 {$and : [ genre: { '$eq': 'POP' }, retail_price: { '$gt': '10' }, retail_price: { '$lt': '20' } ]} 

快乐。 但是这个方法有两个问题:1. $ eq等等,而不是$ eq等等2.数值现在是一个string“10”

我认为(2)是一个讨厌的问题。 由于服务器不知道types(也许它应该是“10”而不是10)。

所以,我想尝试另一种方法。 这是parsing所有到一个queryString,然后转换与JSON.parse()

首先,我build立一些查询string,并在shell中尝试:

 db.products.find({$and: [{genre: { $eq: 'ROC'}}, {retail_price: {$gt:7}}, {retail_price: {$lt:10}}]}) 

奇迹般有效。

然后我试了这个:

 var queryStr = "{$and: [{genre: { $eq: 'ROC'}}, {retail_price: {$gt:7}}, {retail_price: {$lt:10}}]}"; 

和:(产品是mongoose模型)

 Product.find(JSON.parse(queryStr), function(err, product) { if (err) res.send(err); res.json(product); }); 

令我惊讶的是,它根本不起作用。

也在做

 console.log(JSON.stringify(JSON.parse(queryStr))); 

不写输出到控制台。

这里发生了什么?

第一件事是queryStr不是有效的JSON 。 你有什么是一个看起来像一个对象的string。 但是你可能会问“这不是JSON吗?”。 简短的回答:不。 长答案:由于JSON是一种轻量级的数据交换格式,它必须能被各种语言(而不仅仅是Javascript)读取。 所以引用键是使这成为可能的要求:

 var json = '{"foo": true, "bar": 123}'; var str = '{foo: true, bar: 123}'; console.log(JSON.parse(json)); // Object {foo: true, bar: 123} console.log(JSON.parse(str)); // SyntaxError: Unexpected token f 

因此,您可以将查询对象串化为 JSON,然后在将它传递给mongoose方法之前parsing它:

 // On the client var queryJSON = JSON.stringify({$and: [{genre: { $eq: 'ROC'}}, {retail_price: {$gt:7}}, {retail_price: {$lt:10}}]}); // On the server var query = JSON.parse(queryJSON); // Object 

这就是说,回到你原来的两个顾虑:

  1. 引用键名:在这方面他们没有任何影响,所以他们不应该成为一个关切。
  2. 不正确的值types:它看起来像你已经有一个程序格式化查询正确的对象,所以你可以使用Number强制string数值。 (例如Number('10') // 10