2015-01-05 91 views
0

我想查询有两个“或”猫鼬条款,当我需要查询与和条款

的“未到期或常绿由我创建或书签(与空到期帖)帖子”蒙戈分离我查询的问题是,猫鼬是结合或语句组合在一起,使我越来越不正确而(unexpired or evergreen or mine or bookmarked)((unexpired or evergreen) and (mine or bookmarked))

如何更改猫鼬查询是我上述的后者正确的情况下。我应该使用“和”条款吗?或者我应该做一个不(过期>现在)?

var query = 
     Invite.find({ isActive:true }) 
     .or([ 
      { 'expiration': {$gt: new Date()} }, 
      { 'expiration' : null } 
     ]) 
     .or([ 
     { createdBy:userId }, 
     { 'bookmarked.id' : userId } 
     ]) 

回答

3

您可以通过使用Query#and助手为把两个$or条款成一个单一的$and

var query = 
    Invite.find({ isActive:true }) 
    .and([ 
     {$or: [ 
     { 'expiration': {$gt: new Date()} }, 
     { 'expiration': null } 
     ]}, 
     {$or: [ 
     { 'createdBy': userId }, 
     { 'bookmarked.id' : userId } 
     ]} 
    ]) 
0

这就是我认为“帮手”的方法是不是真的帮助很大,因为他们是混淆这个问题。 JavaScript是一种动态类型语言,因此您不需要这些帮助器方法来定义组成查询的数据结构。所有到MongoDB的本地操作符都只在单一查询路径中被接受:

Invite.find(
    { 
     "isActive": true, 
     "$and": [ 
      { "$or": [ 
       { "expiration": null }, 
       { "expiration": { "$gt": new Date() } } 
      ]}, 
      { "$or": [ 
       { "createdBy": userId } 
       { "bookmarked.id": userId } 
      ]} 
     ] 
    }, 
    function(err,result) { 

    } 
);