请检查此查询
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记录的示例文档
{
"_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值
发布于 2020-03-21 16:43:45
通常,当未提供样本输入数据和预期结果时,我会拒绝回答。但是,这种聚合应该会为您提供一个解决方案的想法。通常,当我必须处理日期值时,我更喜欢使用Moment.js库。
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 }]
}
}
}
}
},
])https://stackoverflow.com/questions/60774763
复制相似问题