node.js 操作MongoDB 根据条件 随机取一条记录,怎么做?

RT,node.js 操作MongoDB 根据条件 随机取一条记录,怎么做?

收藏 0 分享浏览 2171
3年前
跟帖

额~我是菜鸟,我想,可不可以先把记录都取出来,然后...在node.js数组里,取第随机数的元素呢?

沙发
芋头
3年前
@Bolt_白衣苍狗 一次性取出来数据量太大了
板凳
张小俊128
3年前
 db.yourCollection.find().limit(-1).skip(yourRandomNumber).next(). 
地板
羽音篠之
3年前
@张小俊128 据说效率不太行
4 楼
OpenGG
3年前
@张小俊128 @羽音篠之 db.yourCollection.find() 返回是 cussor, 而不是所有的内容.
5 楼
羽音篠之
3年前
@张小俊128 @OpenGG 事实上效率问题似乎出在 skip 上,参照 http://stackoverflow.com/a/2824166/1059279
6 楼
全职幽默
3年前
@张小俊128 目前是这样做的,先count再根据count获取skip的随机数
7 楼
AKI_______
3年前

基于 Mongoose。 Model.count( conditions, find);

function find(err, count){ var max = Math.floor(count*Math.random());Model.find(conditions).skip(max).limit(1).exec(callback);}

8 楼
www_少冰_org
3年前

有个办法,就是表中加个递增id的字段,例如count,count建立索引 然后db.collection.findOne({count:{$gt:Math.random()*db.collection.count()}})

9 楼
villins,清玩
3年前
@www_少冰_org MongoDB一般的主键是ObjectID
10 楼
www_少冰_org
3年前
@www_少冰_org @villins,清玩 嗯,只是建索引,不把他当主键
11 楼
全职幽默
3年前
@www_少冰_org 嗯 这个方法 也是可行。但是缺点是,记录都不能删了吧?必须保持count完整性。
12 楼
icetoggle
3年前
@www_少冰_org @全职幽默 可以删,但是就不能保证 随机到每个都平等了。
13 楼

今天通读了《MongoDB权威指南》,顿时觉得自己成大神了。

在MongoDB的查询条件中,有个“$slice”

原文:

假设现在有一个博客文章的文档,要想返回前10条评论,可以:

db.blog.post.findOne(criteria, {"comments": {"$slice": 10}})

findOne()方法的第一个参数criteria代表查询条件

第二个参数可以指定返回哪些键。

如果要返回随机“comments”的话,可以

db.blog.post.findOne(criteria, {"comments": {"$slice": [Math.floor(count*Math.random()), 1]}})

欢迎大家来专栏捧场,我是个爱学习的孩子。

14 楼

在《MongoDB权威指南》中也给出了一个最佳解决方案,就是在插入数据库时给每个文档都添加一个额外的随机键

db.people.insert({"name": "joe", "random": Math.random()})
……
db.people.insert({"name": "bolt", "random": Math.random()})

查询的时候...不用说也知道了吧

16 楼
说几句
广告位 点击查看投放指南

我的收藏