如果字段不存在或为空,则忽略查询中的字段?

时间:2014-09-20 12:59:54

标签: mongodb mongoose

我正在使用以下查询:

$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查询运算符?

1 个答案:

答案 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

对于Doubletype1,默认情况下,存储在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}}]}]
})