1

我正在开发一个过滤系统,您可以按价格、品牌和屏幕尺寸过滤一组电视。现在,我可以按品牌过滤电视,如下所示:

db.tvs.find({brand: {$in: ['LG', 'Samsung']}}) 

它有效。

但现在,我想做同样的事情,但使用多个过滤器(价格和屏幕尺寸),如下所示:

db.tvs.find({brand: {$in: ['LG', 'Samsung']}}, {screensize: {$in: ['37', '42']}}) 

有可能的?

4

3 回答 3

3

你不必使用 $and... 你可以这样做:

db.tvs.find({brand: {$in: ['LG', 'Samsung']}, screensize: {$in: ['37', '42']}})

唯一的区别是

用你的版本

db.tvs.find({brand: {$in: ['LG', 'Samsung']}}, {screensize: {$in: ['37', '42']}})

是我没有关闭品牌后的第一个括号{},也没有在屏幕尺寸之前打开一个新的括号。您需要将它们全部放在同一个 bson 对象中

一个更简单的例子是这样理解的:

db.tvs.find( {brand : "LG" , screensize : '37'}) 
于 2013-10-11T11:28:50.803 回答
0

你应该看看你的代码发生了什么:

db.tvs.find({品牌:{$in:['LG','Samsung']}},{屏幕尺寸:{$in:['37','42']}})

您提出的查询类似于 db.collectionName.find({},{});
检查此文档,它清楚地说db.collection.find({<criteria>}, {<projection>})。所以你的查询应该被构造成它应该属于第一个参数而不是<projection>.

如上所述,在您的情况下,您要进行的第二个查询将作为第二个参数,该参数被解释为projectionprojection参数指定要返回的字段
。 投影参数应按如下方式构造: where,对于要在结果中返回的字段,否则要明确排除。

{'FieldName':1}
10

因此,您正在寻找的答案如下:
db.tvs.find({brand:{$in: ['LG', 'Samsung']}, screensize: {$in: ['37', '42']}})

于 2013-10-11T13:52:23.970 回答
0

我做的。

使用 $and 运算符。

db.tvs.find({ $and: [ { brand: {$in: ["LG", "Samsung"]} },{ size: {$in: ["37"] }}, { price: { $gte: 0 }  }, { price: { $lte: 499 } } ] })
于 2013-10-11T09:53:14.373 回答