2016-08-26 27 views
1

我的应用程序每天都会截取不同尺寸的网页截图。页面和屏幕大小在作业中设置。每个作业指定要捕获的页面数组,以及捕获每个页面的屏幕大小列表。选择MongoDB的第一项匹配条件

每当应用启动时,虽然它会自动为每个活动作业重新获取所有屏幕截图,以防万一它还没有使用当天的屏幕截图。这意味着您可以在同一天为相同的工作,页面和屏幕大小显示两次或更多的屏幕截图。

查看屏幕截图时,尽管我只想每天返回最多一张相同的job,pagescreensize属性。要做到这一点,我想建立一个查询,将贯穿每一天,并检查是否有一天以上的一枪。如果是这样,只返回最早的属性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 
    } 
}); 

总之,我需要的是:每工作屏幕尺寸

回答

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" } 
     } 
    } 
    ] 
) 
+0

我只是去尝试,它本身导致的屏幕大小,网页和工作的独特价值,但只有它为每个独特组合返回一个结果,而我需要每天*一个*每个独特组合。 – Aron

+0

嗨阿隆,我已经添加了分组键,进一步白天进行分组。 –

+0

是的,这似乎工作!现在有什么方法可以清理东西,以便我可以获取屏幕截图文档的列表(就像你从'.find({})'?获得的)。我宁愿不需要添加后处理来摆脱包装'shot'对象的文档 – Aron

相关问题