এটি দুর্দান্ত কাজ করে, এটি দ্রুত, একাধিক ডকুমেন্টের সাথে কাজ করে এবং পপুলেটিং rand
ফিল্ডের প্রয়োজন হয় না , যা শেষ পর্যন্ত নিজেই পপুলেশন করবে:
- আপনার সংগ্রহে .rand ক্ষেত্রে সূচক যুক্ত করুন
- সন্ধান এবং রিফ্রেশ ব্যবহার করুন, এরকম কিছু:
// 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)
}
})
পুনশ্চ. মংডোব প্রশ্নে এলোমেলো রেকর্ডগুলি কীভাবে পাওয়া যায় এই প্রশ্নের সদৃশ হিসাবে চিহ্নিত করা হয়। পার্থক্য হচ্ছে এই প্রশ্নের স্পষ্টভাবে পেয়ে র্যান্ডম ডকুমেন্ট সম্পর্কে অন্যান্য এক হিসাবে একক রেকর্ড সম্পর্কে স্পষ্টভাবে জিজ্ঞেস করল গুলি ।