복붙노트

[MONGODB] MongoDB의에서 임의의 기록

MONGODB

MongoDB의에서 임의의 기록

나는 거대한 (1 억 기록)하여 MongoDB에서 임의의 레코드를 가져 찾고 있어요.

그렇게 할 수있는 가장 빠르고 가장 효율적인 방법은 무엇입니까? 데이터는 이미 내가 난수를 생성하고 임의의 행을 얻을 수있는 더 필드가 없습니다.

어떤 제안?

해결법

  1. ==============================

    1.MongoDB를의 3.2 릴리스부터 $ 샘플 집계 파이프 라인 연산자를 사용하여 컬렉션 N 임의 문서를 얻을 수 있습니다 :

    MongoDB를의 3.2 릴리스부터 $ 샘플 집계 파이프 라인 연산자를 사용하여 컬렉션 N 임의 문서를 얻을 수 있습니다 :

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

    당신은 컬렉션의 필터링 된 하위 집합 앞에 추가 파이프 라인에 $ 일치하는 단계에서 임의 문서를 선택합니다 :

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

    주석에 언급 한 바와 같이 크기가 1보다 큰 경우, 반환 된 문서 샘플 중복이있을 수있다.

  2. ==============================

    2.모든 레코드의 카운트를 수행 0 카운트 사이의 임의의 숫자를 생성하고, 다음을 수행하십시오

    모든 레코드의 카운트를 수행 0 카운트 사이의 임의의 숫자를 생성하고, 다음을 수행하십시오

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

    3.3.2 집계 파이프 라인에 $ 샘플을 소개했다.

    3.2 집계 파이프 라인에 $ 샘플을 소개했다.

    연습으로 퍼팅에 좋은 블로그 게시물도 있습니다.

    이것은 실제로 기능 요청했다 : http://jira.mongodb.org/browse/SERVER-533 있지만 아래에 제출했다 "윌 없습니다 수정."

    요리 책은 모음으로 임의의 문서를 선택할 수있는 아주 좋은 요리법이 있습니다 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를 모두 조회하는 랜드 근처의 임의의 숫자와 문서를 찾을 필요가있다.

    물론 당신은 임의 필드에 색인을 할 것입니다 :

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

    이미 인덱스에 대해 질의하는 경우, 간단하게, 드롭 임의 추가 : 1을 여기에 다시 추가합니다.

  4. ==============================

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

    또한 임의의 번호로 문서를 '가까운'선택하여 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 )
    

    이것은 단지 하나의 쿼리없이 널 검사를 필요로 플러스 코드는 깨끗하고 간단하고 유연합니다. 당신은 당신의 쿼리에 두 번째 임의성 치수를 추가 할 GeoPoint의의 Y 축을 사용할 수 있습니다.

  5. ==============================

    5.다음 조리법 (모든 문서에 임의의 키를 추가) 조금 느린 몽고 요리 책 솔루션보다하지만, 반환보다 균등하게 임의 문서를 배포했습니다. 그것은 조금 덜 균일하게 스킵 (임의) 솔루션보다 분산,하지만 훨씬 더 빠르고 안전 장치를하는 경우 문서에서 제거합니다.

    다음 조리법 (모든 문서에 임의의 키를 추가) 조금 느린 몽고 요리 책 솔루션보다하지만, 반환보다 균등하게 임의 문서를 배포했습니다. 그것은 조금 덜 균일하게 스킵 (임의) 솔루션보다 분산,하지만 훨씬 더 빠르고 안전 장치를하는 경우 문서에서 제거합니다.

    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;
    }
    

    또한 그래서 당신이 그들을 만들 때이를 추가하는 것을 잊지 마세요 문서에 임의의 "임의"필드를 추가 할 필요 제프리 같이 당신이 컬렉션을 초기화해야 할 수도 있습니다

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

    벤치 마크 결과

    이 방법은 (ceejayoz의) 스킵 () 메소드보다 훨씬 더 빠르고보다 균일 마이클에 의해보고 된 "요리 책"방법보다 임의 문서를 생성합니다 :

    1,000,000 요소와 모음의 경우 :

    자신의 난수를 선호하지 않기 때문에 집어 만나지에 요리 책 방법은 문서의 많은 원인이됩니다.

    이 조리법은 완벽하지 않습니다 - 완벽한 솔루션이 내장 된 기능을 다른 사람이 언급 한대로 될 것입니다. 그러나 많은 목적을 위해 좋은 타협해야한다.

  6. ==============================

    6.여기에 기본값을 사용하는 방법이 _id과 약간의 수학, 논리 값을 OBJECTID입니다.

    여기에 기본값을 사용하는 방법이 _id과 약간의 수학, 논리 값을 OBJECTID입니다.

    // 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];
    

    즉, 일반적으로 쉘 표현 로직과 쉽게 적응할 수있다.

    포인트 그래서 :

    그것이 우리가 무엇을 찾고 있기 때문에 "칸"의 타임 스탬프 값에서이 용도 "패딩"유효한 ObjectId가 값을 형성한다. _id 값으로 정수를 사용하는 것은 본질적으로 더 간단하지만 점에서 같은 기본 개념.

  7. ==============================

    7.파이썬에서 pymongo를 사용하여 :

    파이썬에서 pymongo를 사용하여 :

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

    8.의이 해제 키에 데이터가없는 경우는 힘든 것입니다. _id 필드는 무엇인가? 그들이 오브젝트 ID의를 MongoDB를인가? 그렇다면, 당신은 가장 높은 값과 가장 낮은 값을 얻을 수 있습니다 :

    의이 해제 키에 데이터가없는 경우는 힘든 것입니다. _id 필드는 무엇인가? 그들이 오브젝트 ID의를 MongoDB를인가? 그렇다면, 당신은 가장 높은 값과 가장 낮은 값을 얻을 수 있습니다 :

    lowest = db.coll.find().sort({_id:1}).limit(1).next()._id;
    highest = db.coll.find().sort({_id:-1}).limit(1).next()._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);
    
  9. ==============================

    9.지금 당신은 총을 사용할 수 있습니다. 예:

    지금 당신은 총을 사용할 수 있습니다. 예:

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

    해당 문서를 참조하십시오.

  10. ==============================

    10.당신은 임의의 타임 스탬프를 선택하고 이후에 생성 된 첫 번째 객체를 검색 할 수 있습니다. 그것은 반드시 당신에게 균일 한 분포를 제공하지 않습니다하지만 그것은 단지 하나의 문서를 검색합니다.

    당신은 임의의 타임 스탬프를 선택하고 이후에 생성 된 첫 번째 객체를 검색 할 수 있습니다. 그것은 반드시 당신에게 균일 한 분포를 제공하지 않습니다하지만 그것은 단지 하나의 문서를 검색합니다.

    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)
        };
    }();
    
  11. ==============================

    11.파이썬 (pymongo)를 사용하여 집계 기능은 작동합니다.

    파이썬 (pymongo)를 사용하여 집계 기능은 작동합니다.

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

    이 방법은 훨씬 빨리 (임의의 숫자에 대한 쿼리를 실행하는 것보다 예를 들어, collection.find ([random_int).이 특히 큰 컬렉션의 경우입니다.

  12. ==============================

    12.PHP에 내 솔루션 :

    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;
    }
    
  13. ==============================

    13.위해 중복없이 임의 문서의 결정 수를 얻을 수 있습니다 :

    위해 중복없이 임의 문서의 결정 수를 얻을 수 있습니다 :

  14. ==============================

    14.나는 임의의 값이 주어진 확률 이상인 경우에만 방출 당신이지도 기능을 사용하여지도 / 감소를 사용하는 것이 좋습니다 것입니다.

    나는 임의의 값이 주어진 확률 이상인 경우에만 방출 당신이지도 기능을 사용하여지도 / 감소를 사용하는 것이 좋습니다 것입니다.

    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 호출시 (...)

    이 같은 맵리 듀스를 사용하여도 분산됩니다 DB에 사용할 수 있어야합니다.

    정확히 n은 DB에서 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) 인 곳 검색하는 문서의 수이다.

    이 방법은 분산됩니다 데이터베이스에 몇 가지 문제를 줄 수 있습니다.

  15. ==============================

    15.당신은 임의의 _id를 선택하고 해당 객체를 반환 할 수 있습니다 :

    당신은 임의의 _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)
                })
            })
        })
    

    여기 컬렉션의 임의의 숫자를 저장하는 공간을 소비 할 필요가 해달라고.

  16. ==============================

    16.나는 각 개체에 임의 INT 필드를 추가하는 게 좋을 것. 그럼 그냥 작업을 수행 할 수 있습니다

    나는 각 개체에 임의 INT 필드를 추가하는 게 좋을 것. 그럼 그냥 작업을 수행 할 수 있습니다

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

    임의 문서를 선택합니다. 그냥 당신이 ensureIndex 만든다 ({random_field : 1})

  17. ==============================

    17.내가 비슷한 솔루션에 직면하게되었을 때, 나는 역 추적하고 비즈니스 요구가 제시되고있는 재고의 회전의 형태를 만들기 위해 실제로 것을 발견했다. 이 경우, SOLR, MongoDB를 좋아하지 데이터 저장소와 같은 검색 엔진에서 답변이 더 나은 옵션이있다.

    내가 비슷한 솔루션에 직면하게되었을 때, 나는 역 추적하고 비즈니스 요구가 제시되고있는 재고의 회전의 형태를 만들기 위해 실제로 것을 발견했다. 이 경우, SOLR, MongoDB를 좋아하지 데이터 저장소와 같은 검색 엔진에서 답변이 더 나은 옵션이있다.

    모든 문서는 개인 Q 점수 수정을 포함하는 것입니다 걸쳐 즉, "지능적으로 회전"콘텐츠에 대한 요구와 함께, 우리는 대신 임의의 숫자의해야 할 일. 사용자의 작은 인구 가정이 직접 구현하려면, 당신은 제품 ID, 인상 수있다 사용자 당 문서를 저장할 수, 클릭을 통해 수, 마지막으로 본 날짜 및 AQ 점수를 계산하는 의미있는 다른 어떤 요인 비즈니스 발견을 수정. 디스플레이 설정을 검색 할 때, 일반적으로는 최종 사용자가 요청한 것보다 데이터 저장소에서 더 많은 문서를 요청하고 최종 사용자에 의해 요청 된 레코드의 수를 가지고, 질문 점수 수정을 적용하고, 작은 결과의 페이지를 무작위 세트는 그렇게 간단하게 (메모리) 응용 프로그램 계층의 문서를 정렬합니다.

    사용자의 우주가 너무 큰 경우, 당신은 행동 그룹이 아닌 사용자 행동 그룹과 인덱스로 사용자를 분류 할 수 있습니다.

    제품의 우주가 충분히 작은 경우, 당신은 사용자 당 인덱스를 만들 수 있습니다.

    나는이 기술은 훨씬 더 효율적하지만, 더 중요한 것은 더 효과적인 소프트웨어 솔루션을 사용하여 관련, 가치있는 경험을 만드는 것으로 나타났습니다.

  18. ==============================

    18.솔루션의 비는 나를 위해 잘 작동. 많은 격차와 세트가 특히 작다. 이 날 (PHP에서) 매우 잘 작동 :

    솔루션의 비는 나를 위해 잘 작동. 많은 격차와 세트가 특히 작다. 이 날 (PHP에서) 매우 잘 작동 :

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

    19.당신은 몽구스를 사용하는 경우에 당신은 몽구스 랜덤 사용할 수 있습니다 몽구스 랜덤

    당신은 몽구스를 사용하는 경우에 당신은 몽구스 랜덤 사용할 수 있습니다 몽구스 랜덤

  20. ==============================

    20.내 PHP / MongoDB를 RANDOM 솔루션으로 정렬 / 순서. 이 사람을 도움이되기를 바랍니다.

    내 PHP / MongoDB를 RANDOM 솔루션으로 정렬 / 순서. 이 사람을 도움이되기를 바랍니다.

    참고 : 나는 MySQL 데이터베이스 레코드에 참조 내 MongoDB를 수집 내에서 숫자 ID의의가있다.

    우선은 10 개 무작위로 생성 된 숫자 배열을 생성

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

    내 집계에서 나는 $ arrayElemAt 및 $ 모드 (계수)와 결합 된 $ addField 파이프 라인 연산자를 사용합니다. 그때 무작위로 생성 된 숫자 배열의 숫자를 선택하는 데 사용하는 9 - 모듈러스 연산자는 나에게 0의 숫자를 줄 것이다.

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

    그 후 당신은 종류의 파이프 라인을 사용할 수 있습니다.

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

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

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

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

    22.지도 축소 / 사용, 당신은 확실히 다만 반드시 매우 효율적으로 작업하고 결국 결과 필터링 콜렉션의 크기에 따라하지, 임의의 기록을 얻을 수 있습니다.

    지도 축소 / 사용, 당신은 확실히 다만 반드시 매우 효율적으로 작업하고 결국 결과 필터링 콜렉션의 크기에 따라하지, 임의의 기록을 얻을 수 있습니다.

    나는 5 만 개 문서 (필터가 30,000 약에 감소)으로이 방법을 테스트 한, 그것은 약의 실행 16 기가 바이트 램과 인텔 I3와 SATA3 HDD에 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 만 개 가능한 문서에서 약 30,000 이것을 테스트했습니다.

    줄이기 기능은 단순히 0 사이의 임의의 정수 및 항목 (-1) 배열의 수를 픽업하고 어레이로부터 그 _id를 반환한다.

    오랜 시간 같은 소리를 400ms 일, 당신이 천만 기록을 대신 오만, 이것은 그것이 다중 사용자 상황에서 사용할 수 없게 점에 오버 헤드를 증가시킬 수 있었다면 정말이다.

    MongoDB의 핵심에서이 기능을 포함하는 개방 문제가 있습니다 ... https://jira.mongodb.org/browse/SERVER-533

    이 "임의의"선택은 하나를 배열로 ID를 수집하고 선택하는 대신-검색 인덱스에 내장 된 경우, 이것은 매우 도움이 될 것이다. (그것을 투표 간다!)

  23. ==============================

    23.이것은, 빨리 여러 문서와 함께 작동 결국 자신을 채울 것이다, 랜드 필드를 채우는 필요로하지 않는, 좋은 작동합니다 :

    이것은, 빨리 여러 문서와 함께 작동 결국 자신을 채울 것이다, 랜드 필드를 채우는 필요로하지 않는, 좋은 작동합니다 :

    // 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)
      }
    })
    

    추신. 어떻게 MongoDB의 질문에 임의의 기록을 찾으려면이 질문의 중복으로 표시됩니다. 차이점은이 질문에 명시 적으로 임의 문서보기에 대한 다른 하나 하나의 레코드에 대해 명시 적으로 요구한다는 것입니다.

  24. ==============================

    24.당신은 또한 당신의 쿼리를 실행 한 후 셔플 배열을 사용할 수 있습니다

    당신은 또한 당신의 쿼리를 실행 한 후 셔플 배열을 사용할 수 있습니다

    VAR 셔플은 = ( '셔플 어레이')를 요구;

    Accounts.find (쿼리 기능 (ERR, result_array) { newIndexArr = 셔플 (result_array);

  25. ==============================

    25.당신이 mongoid를 사용하는 경우 문서 - 객체 래퍼, 당신은에서 다음을 수행 할 수 있습니다 루비. (모델을 가정 사용자입니다)

    당신이 mongoid를 사용하는 경우 문서 - 객체 래퍼, 당신은에서 다음을 수행 할 수 있습니다 루비. (모델을 가정 사용자입니다)

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

    내 .irbrc, 나는이

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

    그래서 레일 콘솔에서, 내가 예를 들어, 할 수있는,

    rando User
    rando Article
    

    모든 모음에서 임의로 문서를 얻을 수 있습니다.

  26. ==============================

    26.나는이 방법을 사용하고 있습니다

    나는이 방법을 사용하고 있습니다

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

    전체 문서 https://docs.mongodb.com/manual/reference/operator/aggregation/sample/

  27. ==============================

    27.무엇 효율적이고 안정적으로 작동하는 것은 이것이다 :

    무엇 효율적이고 안정적으로 작동하는 것은 이것이다 :

    다음과 같이 각 문서에 "무작위"라는 필드를 추가하고 여기에 임의의 값을 할당, 임의의 필드에 대한 인덱스를 추가하고 진행 :

    이제 우리는 "링크"라는 웹 링크의 컬렉션을 가지고 우리는 그것에서 임의의 링크를 원하는 가정 해 봅시다 :

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

    새로운 임의의 숫자와의 랜덤 필드를, 두 번째 팝업 업데이트되지 않습니다 같은 링크를 확인하려면 :

    db.links.update({random: Math.random()}, link)
    
  28. from https://stackoverflow.com/questions/2824157/random-record-from-mongodb by cc-by-sa and MIT license