选择MongoDB匹配条件的第一项

时间:2016-08-26 13:18:49

标签: mongodb mongoose mongodb-query

我的应用程序每天都会截取各种大小的网页截图。页面和屏幕大小在作业中设置。每个作业指定要捕获的页面数组,以及用于捕获每个页面的屏幕大小列表。

每当应用程序启动时,它会自动再次为每个活动作业截取所有屏幕截图,以防它还没有拍摄当天的屏幕截图。这意味着您可以在同一天为同一作业,页面和屏幕大小两次或更多次结束截屏。

查看屏幕截图时,我只想每天返回最多一次,同时使用相同的jobpagescreensize属性。为此,我想构建一个将在每天运行的查询,并检查当天是否有多个镜头。如果是,则仅返回具有最早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 个答案:

答案 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" }
      }
    }
  ]
)