【问题标题】:How to get random record from one collection MongoDB如何从一个集合 MongoDB 中获取随机记录
【发布时间】:2022-02-03 18:54:11
【问题描述】:

我有实体Article 我正在尝试从数据库集合中检索一条随机记录。

这是实体Article

@Data
@Document(value = "article")
public class Article {

    @Id
    private String articleId;
    private String title;
    private String description;
    private String fullArticle;

这是保存它的服务:

@Override
public Article save(Article article) {
    return articleRepository.save(article);
}

和存储库:

@Repository
public interface ArticleRepository extends MongoRepository<Article, String> {
}

所以,现在我正在尝试创建一种方法,该方法将从我的集合Article 中获取一条随机记录,我还想创建一个控制器,以便当我转到某个端点并提交一些获取方法来检索一个从收藏中记录下来,这样我就可以在邮递员或 Swagger 中检查它。我找到了一些与我类似的问题的答案,但没有人解决我的问题,我想要类似的 API。

【问题讨论】:

    标签: java spring mongodb


    【解决方案1】:

    您可以在聚合查询中使用$sample 来获取随机文档:

    db.collection.aggregate([
      {
        "$sample": {
          "size": 1
        }
      }
    ])
    

    例如here

    我已经测试了代码,它按预期工作。

    您可以创建将此方法添加到存储库中:

    @Aggregation(pipeline={"{$sample:{size:1}}"})
    AggregationResults<Article> random();
    

    然后像这样从服务中调用:

    @Override
    public Article random(){
      return articleRepository.random().getMappedResults().stream().findFirst().orElse(null);
      // also you can use .orElseThrow() or whatever you want
    }
    

    【讨论】:

    • 谢谢,但是我可以通过哪种方式实现它,以便在某些端点等上使用它?
    • 检查this answer。我现在无法测试,但@Aggregation(pipeline = {/*the query*/}) 应该可以工作。另外我会尝试过一段时间测试并发布一个示例。
    • 已编辑问题添加了存储库和服务方法。
    • 这很好,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-11-23
    • 2020-05-13
    • 2012-06-10
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多