source

MongoDB에서 랜덤 레코드를 얻으려면 어떻게 해야 하나요?

manycodes 2023. 4. 6. 21:49
반응형

MongoDB에서 랜덤 레코드를 얻으려면 어떻게 해야 하나요?

방대한 컬렉션(1억 장)에서 랜덤 레코드를 취득하고 싶다고 생각하고 있습니다.

이를 위한 가장 빠르고 효율적인 방법은 무엇일까요?

데이터가 이미 존재하고 난수를 생성하여 난수를 얻을 수 있는 필드가 없습니다.

MongoDB 3.2 릴리즈부터는 집약 파이프라인 연산자를 사용하여 컬렉션에서N개의 랜덤 문서를 취득할 수 있습니다.

// Get one random document from the mycoll collection.
db.mycoll.aggregate([{ $sample: { size: 1 } }])

, 를 합니다.$match다음 중 하나:

// Get one random document matching {a: 10} from the mycoll collection.
db.mycoll.aggregate([
    { $match: { a: 10 } },
    { $sample: { size: 1 } }
])

, 「」의 경우는,size1보다 크면 반환된 문서 샘플에 중복이 있을 수 있습니다.

모든 레코드를 카운트하고 0과 카운트 사이의 난수를 생성한 후 다음을 수행합니다.

db.yourCollection.find().limit(-1).skip(yourRandomNumber).next()

MongoDB 3.2 업데이트

3.2는 어그리게이션 파이프라인에 $sample을 도입했습니다.

실천에 관한 좋은 블로그 글도 있어요.

이전 버전의 경우(이전 답변)

이것은 실제로는 http://jira.mongodb.org/browse/SERVER-533의 기능 요청이었지만, "Won't fix"로 제출되었습니다.

이 요리책에는 컬렉션에서 임의의 문서를 선택할 수 있는 매우 좋은 레시피가 있습니다.http://cookbook.mongodb.org/patterns/random-attribute/

레시피를 바꾸어 설명하려면 문서에 난수를 할당합니다.

db.docs.save( { key : 1, ..., random : Math.random() } )

그런 다음 임의의 문서를 선택합니다.

rand = Math.random()
result = db.docs.findOne( { key : 2, random : { $gte : rand } } )
if ( result == null ) {
  result = db.docs.findOne( { key : 2, random : { $lte : rand } } )
}

에서 $gte ★★★★★★★★★★★★★★★★★」$lte는, 가장 가까운 필요합니다.rand.

물론 랜덤 필드에 인덱스를 붙여야 합니다.

db.docs.ensureIndex( { key : 1, random :1 } )

대해 하고 있는 간단하게 해 .「 」를 합니다.random: 1시시시추추추다다

또한 MongoDB의 지리 공간 색인 기능을 사용하여 임의의 번호에 '가장 가까운' 문서를 선택할 수 있습니다.

먼저 집합에서 지리 공간 인덱싱을 사용하도록 설정합니다.

db.docs.ensureIndex( { random_point: '2d' } )

X축에 랜덤 점이 있는 문서 묶음을 작성하려면:

for ( i = 0; i < 10; ++i ) {
    db.docs.insert( { key: i, random_point: [Math.random(), 0] } );
}

그런 다음 집합에서 다음과 같이 임의 문서를 가져올 수 있습니다.

db.docs.findOne( { random_point : { $near : [Math.random(), 0] } } )

또는 임의의 점에 가장 가까운 여러 문서를 검색할 수 있습니다.

db.docs.find( { random_point : { $near : [Math.random(), 0] } } ).limit( 4 )

이를 위해서는 1개의 쿼리만 필요하며 늘체크는 필요 없습니다.게다가 코드는 깨끗하고 단순하며 유연합니다.지오포인트의 Y축을 사용하여 두 번째 랜덤성 차원을 쿼리에 추가할 수도 있습니다.

다음 레시피는 mongo cookbook 솔루션보다 약간 느리지만(모든 문서에 랜덤 키 추가), 더 균등하게 분산된 랜덤 문서를 반환합니다.skip( random )문서를 삭제해도 훨씬 빠르고 안전합니다.

function draw(collection, query) {
    // query: mongodb query object (optional)
    var query = query || { };
    query['random'] = { $lte: Math.random() };
    var cur = collection.find(query).sort({ rand: -1 });
    if (! cur.hasNext()) {
        delete query.random;
        cur = collection.find(query).sort({ rand: -1 });
    }
    var doc = cur.next();
    doc.random = Math.random();
    collection.update({ _id: doc._id }, doc);
    return doc;
}

또, 임의의 「랜덤」필드를 문서에 추가할 필요가 있습니다.이 필드를 작성할 때는, 이 필드를 추가하는 것을 잊지 말아 주세요.Geoffrey가 나타내는 것처럼 컬렉션을 초기화할 필요가 있는 경우가 있습니다.

function addRandom(collection) { 
    collection.find().forEach(function (obj) {
        obj.random = Math.random();
        collection.save(obj);
    }); 
} 
db.eval(addRandom, db.things);

벤치마크 결과

은 VIP보다 .skip()경우) 및 Michael이의 경우) 합니다.

요소가 1,000,000개인 컬렉션의 경우:

  • 이 방법은 기계에서 1밀리초 미만이 소요됩니다.

  • skip() 180밀리초 .

요리책 방식은 많은 문서들이 무작위로 뽑히지 않기 때문에 절대 뽑히지 않을 것이다.

  • 이 방법을 사용하면 시간이 지남에 따라 모든 요소가 균등하게 선택됩니다.

  • 내 벤치마크에서 그것은 요리책 방법보다 겨우 30% 느렸다.

  • 랜덤성은 100% 완벽하지는 않지만 매우 우수합니다(필요에 따라 개선할 수 있습니다).

이 레시피는 완벽하지 않습니다.완벽한 솔루션은 다른 사람들이 지적한 바와 같이 내장된 기능입니다.
그러나 그것은 여러 가지 목적을 위해 좋은 타협이 될 것이다.

다음으로 디폴트값을 사용하는 방법을 나타냅니다._id수학이랑 논리도 좀 하고

// Get the "min" and "max" timestamp values from the _id in the collection and the 
// diff between.
// 4-bytes from a hex string is 8 characters

var min = parseInt(db.collection.find()
        .sort({ "_id": 1 }).limit(1).toArray()[0]._id.str.substr(0,8),16)*1000,
    max = parseInt(db.collection.find()
        .sort({ "_id": -1 })limit(1).toArray()[0]._id.str.substr(0,8),16)*1000,
    diff = max - min;

// Get a random value from diff and divide/multiply be 1000 for The "_id" precision:
var random = Math.floor(Math.floor(Math.random(diff)*diff)/1000)*1000;

// Use "random" in the range and pad the hex string to a valid ObjectId
var _id = new ObjectId(((min + random)/1000).toString(16) + "0000000000000000")

// Then query for the single document:
var randomDoc = db.collection.find({ "_id": { "$gte": _id } })
   .sort({ "_id": 1 }).limit(1).toArray()[0];

이것이 셸 표현의 일반적인 논리이며 쉽게 적응할 수 있습니다.

그래서 포인트:

  • 컬렉션에서 최소 및 최대 기본 키 값을 찾습니다.

  • 해당 문서의 타임스탬프 사이에 있는 임의의 번호를 생성합니다.

  • 난수를 최소값에 추가하고 해당 값보다 크거나 같은 첫 번째 문서를 찾습니다.

는 "에서 "한 "hex"를 합니다.ObjectId이치노를 '정수'로_id가치는 본질적으로 더 단순하지만 포인트에서는 동일한 기본 개념입니다.

이제 Aggregate를 사용할 수 있습니다.예:

db.users.aggregate(
   [ { $sample: { size: 3 } } ]
)

의사를 참조해 주세요.

Python에서 pymongo를 사용하는 경우:

import random

def get_random_doc():
    count = collection.count()
    return collection.find()[random.randrange(count)]

Python(pymongo)을 사용하면 집약 기능도 동작합니다.

collection.aggregate([{'$sample': {'size': sample_size }}])

이 방법은 랜덤 번호(예를 들어 collection.find([random_int])에 대한 쿼리를 실행하는 것보다 훨씬 빠릅니다.특히 많은 컬렉션이 그렇습니다.

키오프할 데이터가 없으면 어렵습니다. _id 필드는 무엇입니까?mongodb 오브젝트 ID인가요?이 경우 최대값과 최소값을 얻을 수 있습니다.

lowest = db.coll.find().sort({_id:1}).limit(1).next()._id;
highest = db.coll.find().sort({_id:-1}).limit(1).next()._id;

ID가 균등하게 분포되어 있다고 가정할 경우(그러나 ID는 동일하지 않지만 적어도 시작일 경우):

unsigned long long L = first_8_bytes_of(lowest)
unsigned long long H = first_8_bytes_of(highest)

V = (H - L) * random_from_0_to_1();
N = L + V;
oid = N concat random_4_bytes();

randomobj = db.coll.find({_id:{$gte:oid}}).limit(1);

임의의 타임스탬프를 선택하고 이후에 생성된 첫 번째 개체를 검색할 수 있습니다.하나의 문서만 스캔하지만 반드시 균일한 분포를 제공하는 것은 아닙니다.

var randRec = function() {
    // replace with your collection
    var coll = db.collection
    // get unixtime of first and last record
    var min = coll.find().sort({_id: 1}).limit(1)[0]._id.getTimestamp() - 0;
    var max = coll.find().sort({_id: -1}).limit(1)[0]._id.getTimestamp() - 0;

    // allow to pass additional query params
    return function(query) {
        if (typeof query === 'undefined') query = {}
        var randTime = Math.round(Math.random() * (max - min)) + min;
        var hexSeconds = Math.floor(randTime / 1000).toString(16);
        var id = ObjectId(hexSeconds + "0000000000000000");
        query._id = {$gte: id}
        return coll.find(query).limit(1)
    };
}();

php의 솔루션:

/**
 * Get random docs from Mongo
 * @param $collection
 * @param $where
 * @param $fields
 * @param $limit
 * @author happy-code
 * @url happy-code.com
 */
private function _mongodb_get_random (MongoCollection $collection, $where = array(), $fields = array(), $limit = false) {

    // Total docs
    $count = $collection->find($where, $fields)->count();

    if (!$limit) {
        // Get all docs
        $limit = $count;
    }

    $data = array();
    for( $i = 0; $i < $limit; $i++ ) {

        // Skip documents
        $skip = rand(0, ($count-1) );
        if ($skip !== 0) {
            $doc = $collection->find($where, $fields)->skip($skip)->limit(1)->getNext();
        } else {
            $doc = $collection->find($where, $fields)->limit(1)->getNext();
        }

        if (is_array($doc)) {
            // Catch document
            $data[ $doc['_id']->{'$id'} ] = $doc;
            // Ignore current document when making the next iteration
            $where['_id']['$nin'][] = $doc['_id'];
        }

        // Every iteration catch document and decrease in the total number of document
        $count--;

    }

    return $data;
}

중복되지 않고 정해진 수의 랜덤 문서를 얻으려면 다음 절차를 수행합니다.

  1. 먼저 모든 ID를 가져옵니다.
  2. 문서의 크기를 파악하다
  3. 루프 랜덤 인덱스 가져오기 및 중복 건너뛰기

    number_of_docs=7
    db.collection('preguntas').find({},{_id:1}).toArray(function(err, arr) {
    count=arr.length
    idsram=[]
    rans=[]
    while(number_of_docs!=0){
        var R = Math.floor(Math.random() * count);
        if (rans.indexOf(R) > -1) {
         continue
          } else {           
                   ans.push(R)
                   idsram.push(arr[R]._id)
                   number_of_docs--
                    }
        }
    db.collection('preguntas').find({}).toArray(function(err1, doc1) {
                    if (err1) { console.log(err1); return;  }
                   res.send(doc1)
                });
            });
    

몽구스에서 가장 좋은 방법은 $sample로 집약 콜을 하는 것입니다.단, Mongoose는 Mongoose 문서를 Aggregation에 적용하지 않습니다.특히 populate()도 적용할 경우에는 적용되지 않습니다.

데이터베이스에서 "렌" 어레이를 가져오는 경우:

/*
Sample model should be init first
const Sample = mongoose …
*/

const samples = await Sample.aggregate([
  { $match: {} },
  { $sample: { size: 33 } },
]).exec();
console.log(samples); //a lean Array

mongoose 문서 배열 가져오기:

const samples = (
  await Sample.aggregate([
    { $match: {} },
    { $sample: { size: 27 } },
    { $project: { _id: 1 } },
  ]).exec()
).map(v => v._id);

const mongooseSamples = await Sample.find({ _id: { $in: samples } });

console.log(mongooseSamples); //an Array of mongoose documents

임의의 값이 특정 확률보다 높을 때만 맵 기능을 사용하여 방출하는 맵/리듀스를 사용하는 것이 좋습니다.

function mapf() {
    if(Math.random() <= probability) {
    emit(1, this);
    }
}

function reducef(key,values) {
    return {"documents": values};
}

res = db.questions.mapReduce(mapf, reducef, {"out": {"inline": 1}, "scope": { "probability": 0.5}});
printjson(res.results);

위의 reducef 기능은 지도 기능에서 키('1') 하나만 내보내므로 작동합니다.

mapRreduce(...)를 호출할 때 "확률" 값은 "스코프"에 정의됩니다.

이와 같이 mapReduce를 사용하는 것은 sharded db에서도 사용할 수 있습니다.

db에서 정확히 n개의 m개의 문서를 선택하려면 다음과 같이 할 수 있습니다.

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

function reducef(key,values) {
    var newArray = new Array();
for(var i=0; i < values.length; i++) {
    newArray = newArray.concat(values[i].documents);
}

return {"documents": newArray};
}

res = db.questions.mapReduce(mapf, reducef, {"out": {"inline": 1}, "scope": {"countTotal": 4, "countSubset": 2}})
printjson(res.results);

여기서 "countTotal"(m)은 DB에 있는 문서 수입니다. "countSubset"(n)은 검색할 문서 수입니다.

이 방법을 사용하면 샤드 데이터베이스에 문제가 발생할 수 있습니다.

임의의 _id를 선택하여 대응하는 오브젝트를 반환할 수 있습니다.

 db.collection.count( function(err, count){
        db.collection.distinct( "_id" , function( err, result) {
            if (err)
                res.send(err)
            var randomId = result[Math.floor(Math.random() * (count-1))]
            db.collection.findOne( { _id: randomId } , function( err, result) {
                if (err)
                    res.send(err)
                console.log(result)
            })
        })
    })

여기서는 수집에 난수를 저장하는 데 공간을 쓸 필요가 없습니다.

다음 집계 작업은 컬렉션에서 3개의 문서를 무작위로 선택합니다.

db.users.deb ([{$sample: {size: 3 } } ])

https://docs.mongodb.com/manual/reference/operator/aggregation/sample/

MongoDB가 $rand를 보유하게 되었습니다.

되지 않는 항목을 의 항목과 합니다.{ $addFields: { _f: { $rand: {} } } }$sort타타에 _f ★★★★★★★★★★★★★★★★★」$limit

각 개체에 임의 int 필드를 추가하는 것이 좋습니다.그럼 그냥...

findOne({random_field: {$gte: rand()}}) 

임의의 문서를 선택합니다.확실히 해두기만 하면 됩니다.인덱스({random_field:1})

비슷한 솔루션에 직면했을 때, 역추적해 보니, 비즈니스 의뢰는 실제로 제시되고 있는 인벤토리의 순환을 작성하기 위한 것이었습니다.이 경우, MongoDB와 같은 데이터 저장소가 아닌 Solr와 같은 검색 엔진에서 답을 얻을 수 있는 훨씬 더 나은 옵션이 있습니다.

즉, 컨텐츠를 「인텔리전트하게 회전」할 필요가 있기 때문에, 모든 문서에 걸쳐 랜덤한 숫자가 아닌, 퍼스널 q 스코어 수식자를 포함할 필요가 있습니다.사용자 수가 적은 경우를 가정하여 사용자당 productId, 임프레션 수, 클릭 수, 마지막으로 본 날짜 및 기업이 q 점수 수식자를 계산하는 데 의미가 있다고 생각하는 기타 요소를 포함하는 문서를 저장할 수 있습니다.표시할 세트를 취득할 때는 일반적으로 최종 사용자가 요구하는 것보다 더 많은 문서를 데이터스토어에서 요구하고 q 점수 수식자를 적용하여 최종 사용자가 요구한 레코드 수를 가져온 다음 결과 페이지(작은 세트)를 랜덤화하므로 애플리케이션 계층(메모리 내)에서 문서를 정렬하기만 하면 됩니다.

사용자의 영역이 너무 큰 경우 사용자가 아닌 동작 그룹 및 동작 그룹별로 사용자를 분류할 수 있습니다.

제품의 범위가 좁으면 사용자별로 인덱스를 생성할 수 있습니다.

저는 이 기술이 훨씬 더 효율적이라는 것을 알았지만, 무엇보다 소프트웨어 솔루션 사용에 대한 적절하고 가치 있는 경험을 만드는 데 더 효과적이라는 것을 알게 되었습니다.

그 어떤 해결책도 내게는 잘 되지 않았다.특히 틈이 많고 세트가 작을 때는요.이것은 나에게 매우 효과가 있었다(php).

$count = $collection->count($search);
$skip = mt_rand(0, $count - 1);
$result = $collection->find($search)->skip($skip)->limit(1)->getNext();

RANDOM 솔루션별 PHP/MongoDB 정렬/주문.이게 도움이 됐으면 좋겠어요.

주의: MySQL 데이터베이스 레코드를 참조하는 숫자 ID가 MongoDB 컬렉션 내에 있습니다.

먼저 무작위로 생성된 10개의 숫자를 가진 배열을 만듭니다.

    $randomNumbers = [];
    for($i = 0; $i < 10; $i++){
        $randomNumbers[] = rand(0,1000);
    }

집약에서는 $addField 파이프라인 연산자를 $array와 조합하여 사용합니다.ElemAt 및 $mod(계수).계수 연산자는 0 ~9 의 숫자를 지정합니다.이 값을 사용하여 랜덤으로 생성된 숫자를 배열에서 선택합니다.

    $aggregate[] = [
        '$addFields' => [
            'random_sort' => [ '$arrayElemAt' => [ $randomNumbers, [ '$mod' => [ '$my_numeric_mysql_id', 10 ] ] ] ],
        ],
    ];

그런 다음 파이프라인 정렬을 사용할 수 있습니다.

    $aggregate[] = [
        '$sort' => [
            'random_sort' => 1
        ]
    ];

가장 간단한 해결책은...

db.coll.find()
    .limit(1)
    .skip(Math.floor(Math.random() * 500))
    .next()

컬렉션에 500개 이상의 항목이 있는 경우

간단한 ID 키가 있는 경우 모든 ID를 배열에 저장한 다음 임의의 ID를 선택할 수 있습니다(루비 응답).

ids = @coll.find({},fields:{_id:1}).to_a
@coll.find(ids.sample).first

Map/Reduce를 사용하면 랜덤 레코드를 얻을 수 있습니다.다만, 그 결과 필터 처리된 컬렉션의 크기에 따라서는 그다지 효율적으로 취득할 수 없습니다.

50,000개의 문서를 사용하여 이 방법을 테스트했습니다(필터에 의해 약 30,000개까지 감소).이 방법은 16GB RAM과 SATA3 HDD를 탑재한 인텔 i3에서 약 400ms 이내에 실행됩니다.

db.toc_content.mapReduce(
    /* map function */
    function() { emit( 1, this._id ); },

    /* reduce function */
    function(k,v) {
        var r = Math.floor((Math.random()*v.length));
        return v[r];
    },

    /* options */
    {
        out: { inline: 1 },
        /* Filter the collection to "A"ctive documents */
        query: { status: "A" }
    }
);

맵 기능은 쿼리와 일치하는 모든 문서의 ID 배열을 만듭니다.제 경우, 가능한 문서 5만 건 중 약 3만 건으로 테스트했습니다.

축소 함수는 0에서 배열 항목 수(-1) 사이의 임의의 정수를 선택한 다음 배열에서 해당 _id를 반환합니다.

400ms는 긴 시간처럼 들리지만 실제로 5만 개 레코드가 있는 경우 여러 사용자가 사용하는 상황에서 사용할 수 없는 수준까지 오버헤드가 증가할 수 있습니다.

MongoDB가 이 기능을 핵심에 포함시키는 것은 미해결의 문제입니다.https://jira.mongodb.org/browse/SERVER-533

이 "랜덤" 선택이 ID를 어레이에 수집하여 선택하는 것이 아니라 인덱스 룩업에 포함되어 있다면 매우 도움이 될 것입니다.(투표하러 가!)

작업할 수 것, 르, 러, 러, 러, 러, 러, 력, 력, 력, 력, 력, 력, 력, 력, 력, 력, 력, 력, 력, 력, 력, 력, this, this, this, this, this, this, this, this, this, this, ulating, ulating, ulating,,rand으로 자동으로.

  1. 컬렉션의 .rand 필드에 인덱스 추가
  2. 찾기 및 새로 고침을 사용합니다.
// Install packages:
//   npm install mongodb async
// Add index in mongo:
//   db.ensureIndex('mycollection', { rand: 1 })

var mongodb = require('mongodb')
var async = require('async')

// Find n random documents by using "rand" field.
function findAndRefreshRand (collection, n, fields, done) {
  var result = []
  var rand = Math.random()

  // Append documents to the result based on criteria and options, if options.limit is 0 skip the call.
  var appender = function (criteria, options, done) {
    return function (done) {
      if (options.limit > 0) {
        collection.find(criteria, fields, options).toArray(
          function (err, docs) {
            if (!err && Array.isArray(docs)) {
              Array.prototype.push.apply(result, docs)
            }
            done(err)
          }
        )
      } else {
        async.nextTick(done)
      }
    }
  }

  async.series([

    // Fetch docs with unitialized .rand.
    // NOTE: You can comment out this step if all docs have initialized .rand = Math.random()
    appender({ rand: { $exists: false } }, { limit: n - result.length }),

    // Fetch on one side of random number.
    appender({ rand: { $gte: rand } }, { sort: { rand: 1 }, limit: n - result.length }),

    // Continue fetch on the other side.
    appender({ rand: { $lt: rand } }, { sort: { rand: -1 }, limit: n - result.length }),

    // Refresh fetched docs, if any.
    function (done) {
      if (result.length > 0) {
        var batch = collection.initializeUnorderedBulkOp({ w: 0 })
        for (var i = 0; i < result.length; ++i) {
          batch.find({ _id: result[i]._id }).updateOne({ rand: Math.random() })
        }
        batch.execute(done)
      } else {
        async.nextTick(done)
      }
    }

  ], function (err) {
    done(err, result)
  })
}

// Example usage
mongodb.MongoClient.connect('mongodb://localhost:27017/core-development', function (err, db) {
  if (!err) {
    findAndRefreshRand(db.collection('profiles'), 1024, { _id: true, rand: true }, function (err, result) {
      if (!err) {
        console.log(result)
      } else {
        console.error(err)
      }
      db.close()
    })
  } else {
    console.error(err)
  }
})

ps. mongodb 질문에서 무작위 레코드를 찾는 방법은 이 질문의 중복으로 표시됩니다.차이점은 이 질문은 단일 레코드에 대해 명시적으로 질문하고 다른 레코드는 랜덤 문서 가져오기에 대해 질문한다는 것입니다.

저는 같은 레코드를 랜덤 순서로 가져오고 싶었기 때문에 정렬에 사용할 빈 배열을 만들고 1에서 7 사이의 랜덤 번호를 생성했습니다(7개의 필드가 있습니다).따라서 다른 값을 얻을 때마다 다른 랜덤 정렬을 할당합니다.그것은 '레이맨'이지만 나에게는 효과가 있었다.

//generate random number
const randomval = some random value;
//declare sort array and initialize to empty

const sort = [];

//write a conditional if else to get to decide which sort to use

if(randomval == 1)
{


sort.push(...['createdAt',1]);

}

else if(randomval == 2)

{
   sort.push(...['_id',1]);
}

....
else if(randomval == n)
{
   sort.push(...['n',1]);
}

문서 대 객체 래퍼인 mongoid를 사용하는 경우 Ruby에서 다음을 수행할 수 있습니다(모델이 사용자라고 가정).

User.all.to_a[rand(User.count)]

내 .irbrc에는

def rando klass
    klass.all.to_a[rand(klass.count)]
end

레일 콘솔에서는 예를 들어 다음과 같은 작업을 수행할 수 있습니다.

rando User
rando Article

임의의 컬렉션에서 문서를 임의로 가져올 수 있습니다.

쿼리를 실행한 후 shuffle-array를 사용할 수도 있습니다.

var shuffle = required suffle-array' ;

Accounts.find(qry, function(err, results_array){ newIndexArr=sys(results_array);

효율적이고 안정적으로 동작하는 것은 다음과 같습니다.

각 문서에 "임의" 필드를 추가하고 임의 값을 할당한 후 임의 필드에 대한 색인을 추가한 후 다음과 같이 진행합니다.

「링크」라고 불리는 Web 링크의 컬렉션이 있어, 그 링크로부터 랜덤한 링크를 요구하고 있다고 합니다.

link = db.links.find().sort({random: 1}).limit(1)[0]

동일한 링크가 두 번째로 팝업되지 않도록 하려면 해당 랜덤 필드를 새 랜덤 번호로 업데이트합니다.

db.links.update({random: Math.random()}, link)

언급URL : https://stackoverflow.com/questions/2824157/how-can-i-get-a-random-record-from-mongodb

반응형