当我需要用一个 and 子句分隔查询时,在 mongoose 中有两个 "or" 子句

having two "or" clauses in mongoose when I need to separate the query with an and clause

我想查询 mongo 以获得 "unexpired or evergreen(posts with null expiration) posts created or bookmarked by me"

我的查询的问题是 mongoose 将 or 语句组合在一起,所以我得到的是 (unexpired or evergreen or mine or bookmarked) 而不是 ( (unexpired or evergreen) and (mine or bookmarked) )

如何将 mongoose 查询更改为我上面概述的后一种正确情况。我应该使用 "and" 子句...还是应该做一个 not(expiration > now) ?

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

您可以使用 Query#and 帮助程序将两个 $or 子句放入一个 $and 中:

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

这是我认为 "helper" 方法并没有多大帮助的地方,因为它们混淆了问题。 JavaScript 是一种动态类型语言,因此您不需要这些辅助方法来定义构成查询的数据结构。 MongoDB 的所有本机运算符仅在单个查询路径中被接受:

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

    }
);