选择MongoDB匹配条件的第一项
我的应用每天都会截取不同大小的网页截图。页面和屏幕大小在作业中设置。每个作业指定要捕获的页面数组,以及要捕获每个页面的屏幕大小列表 当应用程序启动时,它会自动再次拍摄每个活动作业的所有屏幕截图,以防尚未拍摄当天的屏幕截图。这意味着您可以在同一天内为相同的工作、页面和屏幕大小生成两次或更多的屏幕截图 查看屏幕截图时,尽管我每天只想返回最多一个具有相同选择MongoDB匹配条件的第一项,mongodb,mongoose,mongodb-query,Mongodb,Mongoose,Mongodb Query,我的应用每天都会截取不同大小的网页截图。页面和屏幕大小在作业中设置。每个作业指定要捕获的页面数组,以及要捕获每个页面的屏幕大小列表 当应用程序启动时,它会自动再次拍摄每个活动作业的所有屏幕截图,以防尚未拍摄当天的屏幕截图。这意味着您可以在同一天内为相同的工作、页面和屏幕大小生成两次或更多的屏幕截图 查看屏幕截图时,尽管我每天只想返回最多一个具有相同作业、页面、和屏幕大小属性的截图。为了做到这一点,我想构建一个每天都运行的查询,并检查当天是否有多个镜头。如果是,则只返回具有最早的datetake属
作业
、页面
、和屏幕大小
属性的截图。为了做到这一点,我想构建一个每天都运行的查询,并检查当天是否有多个镜头。如果是,则只返回具有最早的datetake
属性的值
我不确定是否应该为此使用$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
}
});
简言之,我需要的是:每个独特组合的作业,页面,屏幕大小和天,我认为分组是正确的方法:为每个组拍摄最新照片。这可以通过在
$group
之前使用降序$sort
,然后使用$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" }
}
}
]
)
我刚刚尝试过,它确实会根据屏幕大小、页面和作业生成唯一值,但对于每个唯一组合,它只返回一个结果,而对于每个唯一组合,我每天需要一个结果。嗨,Aron,我已经添加了分组键,以便按天进一步分组。是的,这似乎有效!现在有没有办法清理一下,这样我就可以得到一个屏幕截图文档列表(就像你从
.find({})
?)中得到的一样)。我宁愿不必添加后处理来去除包装快照的文档
对象这些文档可以通过添加.map(function(doc){return doc.shot;})
之类的内容来展开,这将返回所有屏幕快照的数组。嗯,是的,我想我会这样做。我只是想如果在查询中有类似的事情我可以做。无论如何,谢谢你的帮助!!