特定日期范围内的MongoDB聚合查找对象

时间:2021-04-20 05:57:38

标签: mongodb mongodb-query aggregation-framework mongodb-atlas

我有一些用户和他们下的订单:

db={
  orders: [
    {
      "_id": "wJNEiSYwBd5ozGtLX",
      "orderId": 52713,
      "retailerId": 1320,
      "createdAt": ISODate("2020-01-31T04:34:13.790Z"),
      "status": "closed"
    },
    {
      "_id": "wJNEiSYwBd5ozGtLX2",
      "orderId": 52714,
      "retailerId": 1320,
      "createdAt": ISODate("2021-03-31T04:34:13.790Z"),
      "status": "closed"
    }
  ],
  users: [
    {
      "_id": "2gSznevqwkGTxLRvL",
      "createdAt": ISODate("2018-04-10T08:33:13.455Z"),
      "username": "retailer@gmail.com",
      "info": {
        "retailerId": 1320,
        
      },
      "settings": {},
      "status": "active",
      
    }
  ]
}

如果我尝试将订单汇总到用户中:

 db.users.aggregate([
      {
        "$lookup": {
          "from": "orders",
          "localField": "info.retailerId",
          "foreignField": "retailerId",
          "as": "orders"
        }
      },
    
    ])

我可以像这样将所有订单合并到用户中:

[
  {
    "_id": "2gSznevqwkGTxLRvL",
    "createdAt": ISODate("2018-04-10T08:33:13.455Z"),
    "info": {
      "retailerId": 1320
    },
    "orders": [
      {
        "_id": "wJNEiSYwBd5ozGtLX",
        "createdAt": ISODate("2020-01-31T04:34:13.79Z"),
        "orderId": 52713,
        "retailerId": 1320,
        "status": "closed"
      },
      {
        "_id": "wJNEiSYwBd5ozGtLX2",
        "createdAt": ISODate("2021-03-31T04:34:13.79Z"),
        "orderId": 52714,
        "retailerId": 1320,
        "status": "closed"
      }
    ],
    "settings": {},
    "status": "active",
    "username": "retailer@gmail.com"
  }
]

但我只想合并上个月的订单,而不是所有订单都合并到用户中。 如何指定日期范围?

https://mongoplayground.net/p/mZlDHQf2thN

1 个答案:

答案 0 :(得分:2)

演示 - https://mongoplayground.net/p/-hjGipqQPJq

https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#join-conditions-and-uncorrelated-sub-queries

<块引用>

为了在两个集合之间执行不相关的子查询并允许除单个相等匹配之外的其他连接条件,$lookup 阶段具有以下语法:

在管道样式中使用 $lookup -

db.users.aggregate([
  {
    "$lookup": {
      "from": "orders",
      "let": { "rId": "$info.retailerId" },
      "pipeline": [
        {
          $match: {
            $expr: { $eq: [ "$retailerId","$$rId" ] },
            createdAt: { $gte: ISODate("2021-03-01T00:00:00.000Z"), $lt: ISODate("2021-04-01T00:00:00.000Z") } // write date range query here
          }
        }
      ],
      "as": "orders"
    }
  }
])