【问题标题】:MongoDB $limit inside an $andMongoDB $limit 在 $and 中
【发布时间】:2020-10-15 11:32:30
【问题描述】:

我希望实现一个查询,该查询将返回一个带有 2 组数据的 JSON。

我要检索的是 40 个 offerDate 仍在未来的订单( $gte: today )和 8 个 offerDate 过去的订单。

目前我只有40个这样的未来:

const orders = await db.Order.aggregate([
    {
      $match: {
        offerDate: {
          $gte: moment().startOf('day').toDate(),
        },
      },
    },
    {
      $limit: 40,
    },

如何在 $ 中添加限制并将两者结合在一起?

我试过了:

$match: {
        $and: [
          {
            offerDate: {
              $gte: moment().startOf('day').toDate(),
            },
            $limit: 40
          },
          {
            offerDate: {
              $lte: moment().startOf('day').toDate(),
            },
            $limit: 8
          },
        ]
      }
    },

但这根本不起作用,我找不到正确的方法。

非常感谢!

【问题讨论】:

    标签: mongodb aggregation-framework aggregate


    【解决方案1】:

    $limit 是一个流水线阶段,不能在任何其他阶段使用,因此您尝试的不是正确的方法。您只需要两个单独的$matches,后跟$limit,$facet 运算符就允许您这样做:

    {
        $facet: {
            greater: [
                { $match: { offerDate: { $gte: moment().startOf('day').toDate() } } },
                { $limit: 40 }
            ],
            lower: [
                { $match: { offerDate: { $lte: moment().startOf('day').toDate() } } },
                { $limit: 8 }
            ]
        }
    },
    {
        $project: {
            all: { $concatArrays: [ "$greater", "$lower" ] }
        }
    }
    

    【讨论】:

    • 这看起来绝对有可能,但是否有可能在同一个对象中同时拥有两个结果?
    • @victorgonal 当然,请参阅我修改后的答案。你可以用 $unwind 和 $replaceRoot 走得更远
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 2015-01-25
    • 2014-07-19
    • 2020-09-24
    • 2012-04-17
    • 1970-01-01
    相关资源
    最近更新 更多