API的查询结构如下:
../myapi/products?_q=genre,retail_price&_a=g,p&p.gt=10&p.lt=20&g.eq=POP
有两个数组:_q列出查询参数,_a列出相应的别名。因此,p->零售价格和g->类型
我可以将其解析为:
{$and : [ genre: { '$eq': 'POP' }, retail_price: { '$gt': '10' }, retail_price: { '$lt': '20' } ]}
快高兴了。但是这种方法有两个问题:1.'$ eq'等代替$ eq等2.数字值现在是字符串'10'
我认为(2)令人讨厌。由于服务器无法知道类型(也许应该是“ 10”而不是10)。
因此,我想尝试另一种方法。并将其全部解析为queryString,然后使用JSON.parse()进行转换
首先,我放入一些查询字符串并在外壳中尝试:
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}}]}";
和:(产品为猫鼬模型)
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。您拥有的是看起来像对象的字符串。但是您可能会问“不是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方法之前进行解析:
// 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
也就是说,回到您最初的两个问题:
Number
将字符串强制为数字值。(例如Number('10') // 10
)本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句