首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDb Create Aggregate Create查询

MongoDb Create Aggregate Create查询
EN

Stack Overflow用户
提问于 2021-07-03 17:20:29
回答 1查看 41关注 0票数 1

我有3个表用户,班次,temporaryShifts,

代码语言:javascript
复制
shifts:[{_id:ObjectId(2222),name:"Morning"},{_id:ObjectId(454),name:"Night"}]
users:[{_id:ObjectId(123),name:"Albert",shift_id:ObjectId(2222)}]

temporaryShifts:[
{_id:2,userId:ObjectId(123),shiftId:ObjectId(454),type:"temporary",date:"2020-02-01"},
{_id:987,userId:ObjectId(123),shiftId:ObjectId(454),type:"temporary",date:"2020-02-03"},
{_id:945,userId:ObjectId(123),shiftId:ObjectId(454),type:"temporary",date:"2020-02-08"},
{_id:23,userId:ObjectId(123),shiftId:ObjectId(454),date:"2020-02-09"}]

我想做一个mongoose聚合查询,然后给我结果:获取两个日期之间的结果例如:2020-02-01 2020-02-05,结果是:

代码语言:javascript
复制
[
{_id:ObjectId(123),name:"Albert",shift:[
{_id:2,shiftId:ObjectId(454),type:"temporary",date:"2020-02-01"},
{_id:2,shiftId:ObjectId(2222),type:"permanent",date:"2020-02-02"},
{_id:2,shiftId:ObjectId(454),type:"temporary",date:"2020-02-03"},
{_id:2,shiftId:ObjectId(2222),type:"permanent",date:"2020-02-04"},
{_id:2,shiftId:ObjectId(2222),type:"permanent",date:"2020-02-05"},
]}
]

在结果类型中表中的临时平均选定日期temporaryShift文档可用否则类型永久

MongoPlayGround You Can edit

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-03 23:16:12

您可以首先使用$range投影日期范围数组,在您的示例中,它将类似于2020-02-01、2020-02-02、2020-02-03、2020-02-04、2020-02-05,然后您可以使用该数组执行$lookup

代码语言:javascript
复制
db.users.aggregate([
  {
    $limit: 1
  },
  {
    "$addFields": {
      "startDate": ISODate("2020-02-01"),
      "endDate": ISODate("2020-02-05")
    }
  },
  {
    "$addFields": {
      "dateRange": {
        "$range": [
          0,
          {
            $add: [
              {
                $divide: [
                  {
                    $subtract: [
                      "$endDate",
                      "$startDate"
                    ]
                  },
                  86400000
                ]
              },
              1
            ]
          }
        ]
      }
    }
  },
  {
    "$addFields": {
      "dateRange": {
        $map: {
          input: "$dateRange",
          as: "increment",
          in: {
            "$add": [
              "$startDate",
              {
                "$multiply": [
                  "$$increment",
                  86400000
                ]
              }
            ]
          }
        }
      }
    }
  },
  {
    "$unwind": "$dateRange"
  },
  {
    "$project": {
      "name": 1,
      "shiftId": 1,
      "dateCursor": "$dateRange"
    }
  },
  {
    "$lookup": {
      "from": "temporaryShifts",
      "let": {
        dateCursor: "$dateCursor",
        shiftId: "$shiftId"
      },
      "pipeline": [
        {
          "$addFields": {
            "parsedDate": {
              "$dateFromString": {
                "dateString": "$date",
                "format": "%Y-%m-%d"
              }
            }
          }
        },
        {
          $match: {
            $expr: {
              $and: [
                {
                  $eq: [
                    "$$dateCursor",
                    "$parsedDate"
                  ]
                }
              ]
            }
          }
        }
      ],
      "as": "temporaryShiftsLookup"
    }
  },
  {
    "$unwind": {
      path: "$temporaryShiftsLookup",
      preserveNullAndEmptyArrays: true
    }
  },
  {
    $project: {
      shiftId: 1,
      type: {
        "$ifNull": [
          "$temporaryShiftsLookup.type",
          "permanent"
        ]
      },
      date: "$dateCursor"
    }
  }
])

这是供您参考的Mongo Playground

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68234870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档