当我需要使用和子句分隔查询时,在mongoose中有两个“或”子句

时间:2015-01-05 22:49:17

标签: javascript mongodb mongoose mongodb-query

我想查询mongo是否为“未过期或常青(有空过期的帖子)帖子创建或收藏我”

我的查询存在的问题是,mongoose将or或者语句组合在一起,因此我错误地获取了(unexpired or evergreen or mine or bookmarked)而不是( (unexpired or evergreen) and (mine or bookmarked) )

如何将mongoose查询更改为后面我概述的后一个正确的案例。我应该使用“和”条款......或者我应该做一个不(过期>现在)?

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

2 个答案:

答案 0 :(得分: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 }
      ]}
    ])

答案 1 :(得分:0)

这就是我认为“辅助”方法并没有真正起作用的地方,因为它们使问题混乱。 JavaScript是一种动态类型语言,因此您不需要这些辅助方法来定义构成查询的数据结构。 MongoDB的所有本机运算符都只接受在单个查询路径中:

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

    }
);