我的应用程序每天都会截取各种大小的网页截图。页面和屏幕大小在作业中设置。每个作业指定要捕获的页面数组,以及用于捕获每个页面的屏幕大小列表。
每当应用程序启动时,它会自动再次为每个活动作业截取所有屏幕截图,以防它还没有拍摄当天的屏幕截图。这意味着您可以在同一天为同一作业,页面和屏幕大小两次或更多次结束截屏。
查看屏幕截图时,我只想每天返回最多一次,同时使用相同的job
,page
和screensize
属性。为此,我想构建一个将在每天运行的查询,并检查当天是否有多个镜头。如果是,则仅返回具有最早dateTaken
属性的那个。
我不确定我是否应该使用$group
。我使用$group
尝试了几个不同的查询,但它将所有镜头合并为一个结果,或者只是返回所有截图,无论白天如何。
这是截图架构:
const ScreenshotSchema = new Schema({
job: {
type: Schema.Types.ObjectId,
ref: 'Job',
required: true
},
dateTaken: {
type: Date,
required: true
},
page: {
type: Schema.Types.ObjectId,
ref: 'Page',
required: true
},
screensize: {
type: Schema.Types.ObjectId,
ref: 'Screensize',
required: true
}
});
简而言之,我需要的是:每个独特组合工作,页面,屏幕尺寸和日
答案 0 :(得分:1)
我认为分组是正确的方法:每个组都采用最新镜头。这可以通过在$sort
之前使用降序$group
,然后使用$first
运算符选择最新镜头来实现:
db.collectionname.aggregate(
[
{
"$sort" : { "dateTaken" : -1 }
},
{
"$group" : {
"_id": {
job:"$job",
page: "$page",
screensize: "$screensize",
year: { "$year" : "$dateTaken"},
month: { "$month" : "$dateTaken" },
dayOfMonth: { "$dayOfMonth" : "$dateTaken"}
},
"shot": { "$first" : "$$ROOT" }
}
}
]
)