[MONGODB] MongoDB의에서 임의의 기록
MONGODBMongoDB의에서 임의의 기록
나는 거대한 (1 억 기록)하여 MongoDB에서 임의의 레코드를 가져 찾고 있어요.
그렇게 할 수있는 가장 빠르고 가장 효율적인 방법은 무엇입니까? 데이터는 이미 내가 난수를 생성하고 임의의 행을 얻을 수있는 더 필드가 없습니다.
어떤 제안?
해결법
-
==============================
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.모든 레코드의 카운트를 수행 0 카운트 사이의 임의의 숫자를 생성하고, 다음을 수행하십시오
모든 레코드의 카운트를 수행 0 카운트 사이의 임의의 숫자를 생성하고, 다음을 수행하십시오
db.yourCollection.find().limit(-1).skip(yourRandomNumber).next()
-
==============================
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.또한 임의의 번호로 문서를 '가까운'선택하여 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.다음 조리법 (모든 문서에 임의의 키를 추가) 조금 느린 몽고 요리 책 솔루션보다하지만, 반환보다 균등하게 임의 문서를 배포했습니다. 그것은 조금 덜 균일하게 스킵 (임의) 솔루션보다 분산,하지만 훨씬 더 빠르고 안전 장치를하는 경우 문서에서 제거합니다.
다음 조리법 (모든 문서에 임의의 키를 추가) 조금 느린 몽고 요리 책 솔루션보다하지만, 반환보다 균등하게 임의 문서를 배포했습니다. 그것은 조금 덜 균일하게 스킵 (임의) 솔루션보다 분산,하지만 훨씬 더 빠르고 안전 장치를하는 경우 문서에서 제거합니다.
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.여기에 기본값을 사용하는 방법이 _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.파이썬에서 pymongo를 사용하여 :
파이썬에서 pymongo를 사용하여 :
import random def get_random_doc(): count = collection.count() return collection.find()[random.randrange(count)]
-
==============================
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.지금 당신은 총을 사용할 수 있습니다. 예:
지금 당신은 총을 사용할 수 있습니다. 예:
db.users.aggregate( [ { $sample: { size: 3 } } ] )
해당 문서를 참조하십시오.
-
==============================
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.파이썬 (pymongo)를 사용하여 집계 기능은 작동합니다.
파이썬 (pymongo)를 사용하여 집계 기능은 작동합니다.
collection.aggregate([{'$sample': {'size': sample_size }}])
이 방법은 훨씬 빨리 (임의의 숫자에 대한 쿼리를 실행하는 것보다 예를 들어, collection.find ([random_int).이 특히 큰 컬렉션의 경우입니다.
-
==============================
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.위해 중복없이 임의 문서의 결정 수를 얻을 수 있습니다 :
위해 중복없이 임의 문서의 결정 수를 얻을 수 있습니다 :
-
==============================
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.당신은 임의의 _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.나는 각 개체에 임의 INT 필드를 추가하는 게 좋을 것. 그럼 그냥 작업을 수행 할 수 있습니다
나는 각 개체에 임의 INT 필드를 추가하는 게 좋을 것. 그럼 그냥 작업을 수행 할 수 있습니다
findOne({random_field: {$gte: rand()}})
임의 문서를 선택합니다. 그냥 당신이 ensureIndex 만든다 ({random_field : 1})
-
==============================
17.내가 비슷한 솔루션에 직면하게되었을 때, 나는 역 추적하고 비즈니스 요구가 제시되고있는 재고의 회전의 형태를 만들기 위해 실제로 것을 발견했다. 이 경우, SOLR, MongoDB를 좋아하지 데이터 저장소와 같은 검색 엔진에서 답변이 더 나은 옵션이있다.
내가 비슷한 솔루션에 직면하게되었을 때, 나는 역 추적하고 비즈니스 요구가 제시되고있는 재고의 회전의 형태를 만들기 위해 실제로 것을 발견했다. 이 경우, SOLR, MongoDB를 좋아하지 데이터 저장소와 같은 검색 엔진에서 답변이 더 나은 옵션이있다.
모든 문서는 개인 Q 점수 수정을 포함하는 것입니다 걸쳐 즉, "지능적으로 회전"콘텐츠에 대한 요구와 함께, 우리는 대신 임의의 숫자의해야 할 일. 사용자의 작은 인구 가정이 직접 구현하려면, 당신은 제품 ID, 인상 수있다 사용자 당 문서를 저장할 수, 클릭을 통해 수, 마지막으로 본 날짜 및 AQ 점수를 계산하는 의미있는 다른 어떤 요인 비즈니스 발견을 수정. 디스플레이 설정을 검색 할 때, 일반적으로는 최종 사용자가 요청한 것보다 데이터 저장소에서 더 많은 문서를 요청하고 최종 사용자에 의해 요청 된 레코드의 수를 가지고, 질문 점수 수정을 적용하고, 작은 결과의 페이지를 무작위 세트는 그렇게 간단하게 (메모리) 응용 프로그램 계층의 문서를 정렬합니다.
사용자의 우주가 너무 큰 경우, 당신은 행동 그룹이 아닌 사용자 행동 그룹과 인덱스로 사용자를 분류 할 수 있습니다.
제품의 우주가 충분히 작은 경우, 당신은 사용자 당 인덱스를 만들 수 있습니다.
나는이 기술은 훨씬 더 효율적하지만, 더 중요한 것은 더 효과적인 소프트웨어 솔루션을 사용하여 관련, 가치있는 경험을 만드는 것으로 나타났습니다.
-
==============================
18.솔루션의 비는 나를 위해 잘 작동. 많은 격차와 세트가 특히 작다. 이 날 (PHP에서) 매우 잘 작동 :
솔루션의 비는 나를 위해 잘 작동. 많은 격차와 세트가 특히 작다. 이 날 (PHP에서) 매우 잘 작동 :
$count = $collection->count($search); $skip = mt_rand(0, $count - 1); $result = $collection->find($search)->skip($skip)->limit(1)->getNext();
-
==============================
19.당신은 몽구스를 사용하는 경우에 당신은 몽구스 랜덤 사용할 수 있습니다 몽구스 랜덤
당신은 몽구스를 사용하는 경우에 당신은 몽구스 랜덤 사용할 수 있습니다 몽구스 랜덤
-
==============================
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.간단한 아이디 키가있는 경우 배열의 모든 ID를 저장 한 다음 임의의 ID를 선택할 수 있습니다. (루비 답) :
간단한 아이디 키가있는 경우 배열의 모든 ID를 저장 한 다음 임의의 ID를 선택할 수 있습니다. (루비 답) :
ids = @coll.find({},fields:{_id:1}).to_a @coll.find(ids.sample).first
-
==============================
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.이것은, 빨리 여러 문서와 함께 작동 결국 자신을 채울 것이다, 랜드 필드를 채우는 필요로하지 않는, 좋은 작동합니다 :
이것은, 빨리 여러 문서와 함께 작동 결국 자신을 채울 것이다, 랜드 필드를 채우는 필요로하지 않는, 좋은 작동합니다 :
// 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.당신은 또한 당신의 쿼리를 실행 한 후 셔플 배열을 사용할 수 있습니다
당신은 또한 당신의 쿼리를 실행 한 후 셔플 배열을 사용할 수 있습니다
VAR 셔플은 = ( '셔플 어레이')를 요구;
Accounts.find (쿼리 기능 (ERR, result_array) { newIndexArr = 셔플 (result_array);
-
==============================
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.나는이 방법을 사용하고 있습니다
나는이 방법을 사용하고 있습니다
db.collection.aggregate( [ { $sample: { size: 5 } } ] )
전체 문서 https://docs.mongodb.com/manual/reference/operator/aggregation/sample/
-
==============================
27.무엇 효율적이고 안정적으로 작동하는 것은 이것이다 :
무엇 효율적이고 안정적으로 작동하는 것은 이것이다 :
다음과 같이 각 문서에 "무작위"라는 필드를 추가하고 여기에 임의의 값을 할당, 임의의 필드에 대한 인덱스를 추가하고 진행 :
이제 우리는 "링크"라는 웹 링크의 컬렉션을 가지고 우리는 그것에서 임의의 링크를 원하는 가정 해 봅시다 :
link = db.links.find().sort({random: 1}).limit(1)[0]
새로운 임의의 숫자와의 랜덤 필드를, 두 번째 팝업 업데이트되지 않습니다 같은 링크를 확인하려면 :
db.links.update({random: Math.random()}, link)
from https://stackoverflow.com/questions/2824157/random-record-from-mongodb by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 어레이 크기가 1보다 큰 문서를 질의 (0) | 2019.11.29 |
---|---|
[MONGODB] 이 개 필드를 비교에 MongoDB의 쿼리 조건 (0) | 2019.11.29 |
[MONGODB] 컬렉션에서 모든 키의 이름을 가져옵니다 (0) | 2019.11.29 |
[MONGODB] 절 보증 순서에서와 MongoDB를의 $ (0) | 2019.11.29 |
[MONGODB] 두 번 중첩 된 배열에서 찾기 MongoDB를 (0) | 2019.11.29 |