MongoDB 随机查询一条数据语语句

换个思路,我们可以在每个文档加一个随机键(random),用Math.random()方法生成随机数,存放进文档里。查询的时候,同样用Math.random()生成一个随机数,返回一条集合中随机数小于这个随机数的文档。当然,也有可能没有小于这个随机数的文档,但如果这样,就必定有一个大于等于这个随机数的文档,除非集合是空的。

查询一条随机数据

 代码如下 复制代码

var random=Math.random();
var result=db.user.findOne({"random":{"$lt":random}});
if(result==null)
{
result=db.user.findOne({"random":{"$gte":random}});
}

PRIMARY> db.phoneMessage.count()
8704224
PRIMARY> db.phoneMessage.find().limit(-1).skip(Math.floor(Math.random()*8704221)).next()

 
查询多条随机数据

1.参考单条查询,可用个循环,将查询的数据插入到集合t中。

 代码如下 复制代码

for(var i=0;i<1000;i++) {var c=db.phoneMessage.find().limit(-1).skip(Math.floor(Math.random()*8704221)).next(); db.t.insert(c) }

这种方法简单,但是数据量大的情况下,skip效率很低,耗时较长。

2.通过map/reduce来查询

mongodb 2.2以上可用如下方法,2.0格式有点问题

 代码如下 复制代码

function mapf() {
    if(countSubset == 0) return;
    var prob = countSubset / countTotal;
    if(Math.random() <= prob) {
    emit(1, this);
    countSubset--;
    }
    countTotal--;
}

function reducef(key,values) {
    return {"documents": values};
}
res = db.phoneMessage.mapReduce(mapf, reducef, {"out": {"inline": 1}, "scope": {"countTotal": 87042, "countSubset": 1000}})
db.t.insert(res.results[0].value.documents)

此方法也无法应对大数据量情况,会报错InternalError: too much recursion

3.添加一个随机数的字段,再查询就简单了
这种方法会比较好,但更改了集合结构。

时间: 2024-09-20 18:44:04

MongoDB 随机查询一条数据语语句的相关文章

帝国cms随机读取20条数据sql语句

自己经常使用sql语句,没有总结出一个系统的sql语句大全来.今天就顺带在发个随机读取20条数据sql语句,留着以后自己用.也让后来者可以一起分享分享. [ecmsinfo]"select * from [!db.pre!]ecms_news where (classid  between 1 and 10) order by rand()  LIMIT  20",20,36,0,24,2,0[/ecmsinfo]

sql随机查询N条数据语句

mysql是这样实现的:  代码如下 复制代码 select * from tablename order by rand() limit 10 说明:rand()返回在范围0到1.0内的随机浮点值 sqlserver是这样实现的:  代码如下 复制代码 select top 10 * from tableName order by NewID() 说明:NewID()在扫描每条记录的时候都生成一个值, 而生成的值是随机的, 没有大小写顺序 友情提示:如果你是几万条数据是可以使用上面方法实现了,

sqlserver 1 n-sqlserver 两个表关联1:n求随机取一条数据的sql语句实现!

问题描述 sqlserver 两个表关联1:n求随机取一条数据的sql语句实现! 现在要补齐tb1中演唱歌曲字段.条件是去tb2中查找相同艺人演唱过的歌曲,随机填充到tb1中的歌曲名字段 一个歌手不止演唱一首歌,所以tb2中是艺人演唱所有歌曲的集合.tb1中同一个歌手可能出现好几次 补齐时候需根据tb1中艺人名称去tb2也就是艺人歌曲汇总表中查找相同艺人演唱的歌曲名称. 需要在艺人名相同情况下随机取tb2中演唱歌曲名去一一补齐tb1中的字段 tb1 tb1 艺人 演唱歌曲名 a null b n

sql 随机抽取几条数据的方法 推荐_MsSql

传说用这个语句管用:select top 5 * from tablename order by newid() 我放到sql的查询分析器里去执行果然管用,随机抽取5条信息,不停的换,结果我应用到程序里的时候就不管用了,总是那几条,于是对这个东西进行了一个研究得出另一种方法: newid() 可以产生如:"49869293-8891-4B31-B88E-A584D9621490" 这样的数据结果,而且每一行产生的都不同,这样的话,我们就可以在查询的时候给结果集里加上这么一个列,比如:

四种数据库随机获取10条数据的方法_Access

四种数据库随机获取10条数据的方法 SQL Server: 复制代码 代码如下: SELECT TOP 10 * FROM T_USER ORDER BY NEWID() ORACLE: 复制代码 代码如下: SELECT * FROM (SELECT * FROM T_USER ORDER BY DBMS_RANDOM.RANDOM()) WHERE RONUM <= 10 MySQL: 复制代码 代码如下: SELECT * FROM T_USER  ORDER BY  RAND() LIM

方法-从数据库查询多条数据

问题描述 从数据库查询多条数据 数据库表是这样的:表A有个字段number,根据number查询表B(附件的相关信息)的信息, 我有一个表单页面,有一个附件,我用HyperLink做的.现在的问题是:我的方法只能返回一个实体类,如果有两个附件,我该怎么做? 解决方案 如果附件有多个, 那你不应该搞一个 HyperLink 控件, 而应该用一个 Panel 容器控件, 这样: 如果没有附件, 则容器为空, 如果有一个附件, 则加入一个 HyperLink 控件 如果有2个附件, 则加入2个 Hyp

有一个WEB服务器,两个客户同时操作JSP页面,一个删除一条数据,一个正好查询这条数据,报错了,怎么解决啊,急!!

问题描述 有一个WEB服务器,两个客户同时操作JSP页面,一个删除一条数据,一个正好查询这条数据,报错了,怎么解决啊,急!! 解决方案 解决方案二:引用楼主duobiao的回复: 有一个WEB服务器,两个客户同时操作JSP页面,一个删除一条数据,一个正好查询这条数据,报错了,怎么解决啊,急!! ......怎么会出错呢难道你做什么都不判断么?解决方案三:报啥错?解决方案四:一句话问题!不知道你是用什么做的,操作数据库用的是什么,数据库用的是什么,反正要有的什么都没有!解决方案五:引用2楼swan

mongodb 随机获取一条记录的方法_MongoDB

原理: 1.先查询表中的记录总数 2.随机获取偏移量为0~总记录数-1 3.查询时skip偏移量,再获取1条记录 因本人测试环境PHP已升级到7.0以上,mongodb扩展使用支持php7.0以上的扩展,很多方法与php5.6不同.因此代码必须在php7.0以上运行.如果是php5.6环境,需要修改代码才能运行. 代码如下: function.php <?php // 连接mongodb function conn($host, $user, $passwd){ $server = 'mongo

mysql 查询筛选重复数据sql语句

查询重复数据数量  代码如下 复制代码 select device_id from device group by device_id having count(device_id) > 1; 查询所有重复数据  代码如下 复制代码 select userid, device_id, create_date from device where device_id in (select device_id from device group by device_id having count(de