2017-02-21 51 views
0

我有下面的聚合,我正在测试按类别将文档分组,并将每个组的结果限制为N,在这个示例中为20,因为我想总共有100个结果,我有5个类别。mongo查询和切片N值

100值将保持不变,但万一类别数可能会改变,而不是硬编码整数我想知道它是否可以计算? slicedocumentationN can be any expression as long as it resolves to an integer但不知道如何用更像100/category_count的东西替代20?

{ 
    $sort: { 
     created_at: 1 
    } 
}, { 
    $group: { 
     _id: { 
      category: "$category", 
      created_at: "$created_at", 
      video_id: "$video_id" 
     } 
    } 
}, { 
    $group: { 
     _id: "$_id.category", 
     items: { 
      $push: { 
       created_at: "$_id.created_at", 
       video_id: "$_id.video_id" 
      } 
     } 
    } 
}, { 
    $project: { 
     items: { 
      $slice: ["$items", 0, 20] 
     } 
    } 
} 

感谢 FLO

+1

什么是“category_count”?这是一个计算字段的名字吗? – styvane

回答

0

可以更新聚合管道下方。 使用第一个group可以获得不同的类别数组,并根据该数据使用每个类别的projectslice中的计数。

{ 
    $group: { 
     _id: { 
      category: "$category", 
      created_at: "$created_at", 
      video_id: "$video_id" 
     }, 
     categories: { 
      $addToSet: "$category" 
     } 
    } 
}, { 
    $group: { 
     _id: "$_id.category", 
     items: { 
      $push: { 
       created_at: "$_id.created_at", 
       video_id: "$_id.video_id" 
      } 
     }, 
     categories: { 
      $first: "$categories" 
     } 
    } 
}, { 
    $project: { 
     items: { 
      $slice: ["$items", 0, { 
       $size: "$categories" 
      }] 
     } 
    } 
} 
+0

谢谢,但这没有得到类别计数,而是返回'项目'数组的计数。需要进入第一个“团队”,但不知道如何将这些前瞻推向预测? –

+0

不知道我是否正确理解您的要求。更新为在第一个小组阶段包含'category_count'。 – Veeram

+0

你的第一个答案是有道理的,但它会返回'items'数组中条目的数量。不是项目切片计算所需的各个类别的计数。所以当我测试时,category_count等于168或211等..不是预期的5. –