我正在开发一个过滤系统,您可以按价格、品牌和屏幕尺寸过滤一组电视。现在,我可以按品牌过滤电视,如下所示:
db.tvs.find({brand: {$in: ['LG', 'Samsung']}})
它有效。
但现在,我想做同样的事情,但使用多个过滤器(价格和屏幕尺寸),如下所示:
db.tvs.find({brand: {$in: ['LG', 'Samsung']}}, {screensize: {$in: ['37', '42']}})
有可能的?
你不必使用 $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'})
你应该看看你的代码发生了什么:
db.tvs.find({品牌:{$in:['LG','Samsung']}},{屏幕尺寸:{$in:['37','42']}})
您提出的查询类似于
db.collectionName.find({},{});
检查此文档,它清楚地说db.collection.find({<criteria>}, {<projection>})
。所以你的查询应该被构造成它应该属于第一个参数而不是<projection>
.
如上所述,在您的情况下,您要进行的第二个查询将作为第二个参数,该参数被解释为projection。projection参数指定要返回的字段
。
投影参数应按如下方式构造:
where,对于要在结果中返回的字段,否则要明确排除。
{'FieldName':1}
1
0
因此,您正在寻找的答案如下:
db.tvs.find(
{
brand:{$in: ['LG', 'Samsung']}, screensize: {$in: ['37', '42']}
}
)
我做的。
使用 $and 运算符。
db.tvs.find({ $and: [ { brand: {$in: ["LG", "Samsung"]} },{ size: {$in: ["37"] }}, { price: { $gte: 0 } }, { price: { $lte: 499 } } ] })