我正在使用以下查询:
$and : [
{$where : 'function(){if(this.vehicle.class){return this.vehicle.class == "Car";};return true;}'},
{$where : 'function(){if(this.vehicle.make){return this.vehicle.make == "MERCEDES-BENZ";};return true;}'},
{$where : 'function(){if(this.vehicle.model){return this.vehicle.model == "320";};return true;}'},
{$where : 'function(){if(this.price && this.price.min){return this.price.min >= 1000;};return true;}'},
{$where : 'function(){if(this.price && this.price.max){return this.price.max <= 1000;};return true;}'}
]
如果字段未设置或为空,是一种更优雅的方法来忽略查询中的字段?使用本机mongo查询运算符?
答案 0 :(得分:4)
要忽略不存在或为空的字段,您需要使用$exists
和$type
查询运算符的组合。
$存在:
语法:{field:{$ exists:
<boolean>
}}
当<boolean>
为真时,$ exists与包含该文件的文档匹配 字段,包括字段值为null的文档。如果<boolean>
如果为false,则查询仅返回不包含的文档 字段。$型:
$ type选择字段值为的文档 指定的BSON类型
BSON types:
Null 10
Double 1
String 2
要查看mongodb中的所有有效BSON类型,请参阅:http://docs.mongodb.org/manual/reference/bson-types/
例如,下面的mongo查询将获取字段vehicle.class
exists
并包含String
类型数据的文档。
db.collection.find({"vehicle.class":{$exists:true,$type:2}})
type 2
表示,字符串和type 10
表示null
。我们希望找到那些记录,其中存储在vehicle.class中的数据类型(如果存在)是String
,而不是null
。
对于Double
,type
为1
,默认情况下,存储在mongodb中的数字的数据类型为“Double”。
db.collection.find({"price.max":{$exists:true,$type:1}})
使用$and
和$or
与$exists
和$type
的组合,可以获得您想要的输出。
db.collection.find({
$and:[{$or:[{"price.max":{$lte:1000}},{"price.max":{$exists:false}},{"price.max":{$type:10}}]},
{$or:[{"price.min":{$gte:1000}},{"price.min":{$exists:false}},{"price.min":{$type:10}}]},
{$or:[{"vehicle.model":{$in:["320"]}},{"vehicle.model":{$exists:false}},{"vehicle.model":{$type:10}}]},
{$or:[{"vehicle.make":{$in:["MERCEDES-BENZ"]}},{"vehicle.make":{$exists:false}},{"vehicle.make":{$type:10}}]},
{$or:[{"vehicle.class":{$in:["Car"]}},{"vehicle.class":{$exists:false}},{"vehicle.class":{$type:10}}]}]
})