多个$和多个$或$ match mongoose

时间:2016-06-09 10:02:23

标签: mongodb mongodb-query

预期条件

if(pid==req.session.pid && 
   ((status==0 && StatusDate1>=somedate)||(status==1 && StatusDate2>=somedate)||
    (status==2 && StatusDate3>=somedate)||(status==0 && StatusDate1>=somedate)))

我尝试在$match语句下面写一下,以满足上述条件,但由于某种原因,它不符合预期。

var match =  { $match: { 
    $and: [ 
        { practiceId: req.session.p_id },  
        {
            $or:[{status : 0, StatusDate1:{$gte:somedate}}] 
        }, 
        {           
            $or:[{status : 1, StatusDate2:{$gte:somedate}}] 
        },
        {           
            $or:[{status : 2, StatusDate3:{$gte:somedate}}] 
        },
        {           
            $or:[{status : 3, StatusDate4:{$gte:somedate}}] 
        }]
    }
}

有人可以指出我正确的方向吗?

更新

尝试以下版本,仍然没有得到我期待的结果。

尝试1

var match =  { $match: { 
    $and: [ 
        { practiceId: req.session.p_id }],
    $and:[  
        {
            $or:[{status : 0, StatusDate1:{$gte:somedate}}] 
        }, 
        {           
            $or:[{status : 1, StatusDate2:{$gte:somedate}}] 
        },
        {           
            $or:[{status : 2, StatusDate3:{$gte:somedate}}] 
        },
        {           
            $or:[{status : 3, StatusDate4:{$gte:somedate}}] 
        }]
    }
}

尝试2

var match =  { $match: { 
    practiceId: req.session.p_id ,
    $and:[  
        {
            $or:[{status : 0, StatusDate1:{$gte:somedate}}] 
        }, 
        {           
            $or:[{status : 1, StatusDate2:{$gte:somedate}}] 
        },
        {           
            $or:[{status : 2, StatusDate3:{$gte:somedate}}] 
        },
        {           
            $or:[{status : 3, StatusDate4:{$gte:somedate}}] 
        }]
    }
}

尝试3

var match =  { $match: { 
    practiceId: req.session.p_id,
        $and:[  
        {
            $or:[{status : 0,StatusDate1:{$gte:somedate}}], 
            $or:[{status : 1,StatusDate2:{$gte:somedate}}], 
            $or:[{status : 2,StatusDate3:{$gte:somedate}}], 
            $or:[{status : 3,StatusDate4:{$gte:somedate}}] 
        }
    ]
  }

}

1 个答案:

答案 0 :(得分:3)

  

语法: - {$或:[expression1,expression2,...]}

看看这是否可以帮到你: -

var match =  { $match: { 
$and: [ 
    { practiceId: req.session.p_id },  
    {
        $or:[{status : 0, StatusDate1:{$gte:somedate}},
             {status : 1, StatusDate2:{$gte:somedate}},
             {status : 2, StatusDate3:{$gte:somedate}},
             {status : 3, StatusDate4:{$gte:somedate}}] 
    }]
}
}

,内添加了$or分隔条件。见$or