将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
这就是说,回到你原来的两个顾虑:
- 引用键名:在这方面他们没有任何影响,所以他们不应该成为一个关切。
- 不正确的值types:它看起来像你已经有一个程序格式化查询正确的对象,所以你可以使用
Number
强制string数值。 (例如Number('10') // 10
)