首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >$first使用$last和mongodb聚合,如果找不到记录,则用零更新值

$first使用$last和mongodb聚合,如果找不到记录,则用零更新值
EN

Stack Overflow用户
提问于 2020-03-20 21:04:53
回答 1查看 108关注 0票数 0

请检查此查询

代码语言:javascript
复制
db.orders.aggregate([
    {
        '$match': {
            "userId" : ObjectId("5e7147ada3141a63a0dbc154"),
        "adminId" :  ObjectId("5e7147e8fc64ed3d2473o2fec"),
            '$or': [{
                    'orderedOnDate': ISODate("2020-03-21T00:00:00Z")
                    }, 
                     {
                      'orderedOnDate': ISODate("2020-03-14T00:00:00Z")
                    }]
              }
         }, 
        {
        '$unwind': {
            'path': '$totalOrders',
          },
        },
       {
        '$group': {
            '_id': {
                'code': '$totalOrders.code',
                'date': '$orderedOnDate',
            },
            'orderCount': {
                '$last': '$totalOrders.orderCount',
            },
             'sortedDate': {
                '$last': '$orderedOnDate'
            }
        }
    }
    , {
        '$sort': {
            'sortedDate': 1
        }
    }, {
        '$group': {
            '_id': '$_id.code',
            'orderCount': {
                '$last': '$orderCount'
            },
            'previousOrderCount': {
                '$first': '$previousOrderCount'
            },
           'sortedDate': {
                '$last': '$sortedDate'
            },
            'previousSortedDate': {
                '$first': '$sortedDate'
            },

        }
    },
      {
        '$project': {
            "_id": 0,
           'code':1
            'sortedDate': 1,
            'orderCount': 1,
            'previousWeekCount': [
                {
                    'sortedDate': '$previousOrderCount',
                    'orderCount': '$previousOrderCount',

                }
            ]
        }
    }])

在上面的查询中,我试图获取明天日期和D-7日期的数据,如果它找到这两个日期的记录,查询就会按预期工作,现在问题出现了,当D-7天没有记录时,$first和$last具有相同的日期,因此它也在previousWeekCount中显示相同的数据。但我想插入0值,如果没有D-7 day.Also的记录,我需要维护$project结构,因为它已经被发送到前端。我尝试了一些东西,如$ifnull,也尝试了$cond on date,但没有任何建议或如何解决它.Below是没有D-7 date记录的示例文档

代码语言:javascript
复制
{
    "_id" : ObjectId("5e73089d44eb7a50708167fc"),
    "orderedOnDate" : ISODate("2020-03-21T00:00:00.000Z"),
     "totalOrders" : [
            {      
                "orderCount" : 10,
                "code" : "#001",
            },
            {      
                "orderCount" : 46,
                "code" : "#002",
            },
    ],
}

现在,如果没有D-7天的记录,我可以在代码中显示orderCount :0吗?我不想保存D-7的文档,只需要显示0值

EN

回答 1

Stack Overflow用户

发布于 2020-03-21 16:43:45

通常,当未提供样本输入数据和预期结果时,我会拒绝回答。但是,这种聚合应该会为您提供一个解决方案的想法。通常,当我必须处理日期值时,我更喜欢使用Moment.js库。

代码语言:javascript
复制
db.collection.aggregate([
   {
      $match: {
         userId: ObjectId("5e7147ada3141a63a0dbc154"),
         orderedOnDate: { $in: [moment.utc().startOf('day').toDate(), moment.utc().startOf('day').subtract(7, 'days').toDate()] }
      }
   },
   { $sort: { orderedOnDate: 1 } },
   {
      $group: {
         _id: null,
         lastWeekOrders: { $first: "$$ROOT" },
         todayOrders: { $last: "$$ROOT" }
      }
   },
   {
      $set: {
         lastWeekOrders: {
            $cond: {
               if: { $eq: ["$lastWeekOrders.orderedOnDate", moment.utc().startOf('day').subtract(7, 'days').toDate()] },
               then: "$lastWeekOrders",
               else: {
                  orderedOnDate: moment.utc().startOf('day').subtract(7, 'days').toDate(),
                  totalOrders: [{ orderCount: 0 }]
               }
            }
         }
      }
   },
   {
      $set: {
         todayOrders: {
            $cond: {
               if: { $eq: ["$todayOrders.orderedOnDate", moment.utc().startOf('day').toDate()] },
               then: "$todayOrders",
               else: {
                  orderedOnDate: moment.utc().startOf('day').toDate(),
                  totalOrders: [{ orderCount: 0 }]
               }
            }
         }
      }
   },
])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60774763

复制
相关文章

相似问题

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