mongo 从 collection 中随机查询多条记录

本文介绍两种在MongoDB中实现随机抽取记录的方法:通过增加随机字段进行查询与使用计数结合随机skip和limit进行查询。重点讲解了第一种方法的具体实现步骤。

在项目中,需要从某个类集中【随机】抽取几条记录的需求。而 mongo 中是没有现成的实现方式的。

目前仅想到有 2 种方式:

  1. 在插入记录中,人为添加一个字段 random 字段。查询时使用 &gte 和 &lte 搭配使用查询出多条随机记录数
  2. 先使用 count 计算出总记录数,在使用随机的 skip 和 limit 搭配查询出多条随机记录数
  3. 好像可以使用地理索引,这方面没接触过,暂不考虑

显而易见的使用【方法一】是明智之选

double rand = Math.random();
        JSONObject query = new JSONObject();
        query.put("random", new BasicDBObject("$gte", rand));
        String fields = "{_id:0,letId:1,heroId:1,heroLevel:1}";
        String sort = "{heroLevel:1}";
        // 大于 随机值 条件查找记录
        {
            MongoCursor<JSONObject> mongoCursor = getJgCollection().find(query.toString()).limit(10).sort(sort).projection(fields).as(JSONObject.class);
            while (mongoCursor.hasNext()) {
                JSONObject temp = mongoCursor.next();
                array.add(temp);
            }
        }
        // 若未取得值,则用 小于 随机值 条件查找记录
        if (array.size() == 0) {
            query.remove("$gte");
            query.put("random", new BasicDBObject("$lte", rand));
            MongoCursor<JSONObject> mongoCursor = getJgCollection().find(query.toString()).limit(10).sort(sort).projection(fields).as(JSONObject.class);
            while (mongoCursor.hasNext()) {
                JSONObject temp = mongoCursor.next();
                array.add(temp);
            }
        }
### MongoDB 和 MinIO 的比较 #### 数据模型 MongoDB 是一种面向文档的 NoSQL 数据库,支持灵活的数据结构。数据存储为 BSON 文档形式,类似于 JSON 对象[^1]。 MinIO 则是一个高性能的对象存储系统,兼容 Amazon S3 API。它主要用于处理大规模非结构化数据,如图片、视频和其他二进制大对象(BLOB)[^2]。 #### 查询能力 MongoDB 提供丰富的查询功能,包括聚合框架、地理空间索引以及全文搜索引擎集成等功能。这使得复杂查询操作变得简单高效。 对于 MinIO 而言,由于其设计初衷并非为了执行复杂的查询逻辑,因此不提供类似的高级查询特性;不过可以通过外部工具对接实现特定需求下的检索优化。 #### 编程接口与生态 作为数据库产品,MongoDB 支持多种编程语言驱动程序,并拥有庞大的社区资源和技术文档支持体系,在 Web 应用开发领域应用广泛。 相比之下,虽然 MinIO 同样具备良好的跨平台特性和多语言 SDK ,但更多地被应用于云原生环境中的文件管理和备份场景下,特别是在 Kubernetes 集群内部署时表现出色。 #### 性能表现 当涉及到读写速度测试时,两者各有千秋: - **随机访问性能**:如果应用程序频繁进行小规模记录级别的随机存取,则 MongoDB 可能会更胜一筹; - **批量传输效率**:而对于大量静态资源的一次性上传下载任务来说,专为高吞吐量而构建的 MinIO 显得更加适合。 ```python import pymongo from minio import Minio # 连接到 MongoDB 实例并插入一条记录 client = pymongo.MongoClient('mongodb://localhost:27017/') db = client['test_database'] collection = db['sample_collection'] result = collection.insert_one({"name": "Alice", "age": 25}) # 使用 MinIO 客户端上传文件到指定桶中 minio_client = Minio( 'play.min.io', access_key='YOUR-ACCESSKEYID', secret_key='YOUR-SECRETACCESSKEY' ) with open('/path/to/file', 'rb') as file_data: minio_client.put_object( 'mybucket', 'file_name.ext', file_data, length=-1, part_size=10 * 1024 * 1024 ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值