选择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;})
之类的内容来展开,这将返回所有屏幕快照的数组。嗯,是的,我想我会这样做。我只是想如果在查询中有类似的事情我可以做。无论如何,谢谢你的帮助!!