猫鼬:我如何获得5个不同条件的5个随机记录?

时间:2014-05-30 10:19:26

标签: node.js mongodb express mongoose database

我的模型:问题(只有与问题相关的数据被删除所有其他内容)

exports = module.exports = function(app, mongoose) {
  var questionSchema = new mongoose.Schema({
    difficultyLevel: {
        type: String,
        enum: ['easy', 'medium', 'hard']
    },
    questionType: {
        type: String,
        enum: ['Type1', 'Type2', 'Type3']
    },
    questionText: {
        type: String,
        trim: true
    }
  });
  questionSchema.plugin(require('./plugins/pagedFind'));
  questionSchema.set('autoIndex', (app.get('env') === 'development'));
  app.db.model('Questions', questionSchema);
};

我的数据库中有大约250多个问题。

我的要求:我需要5个RANDOM问题,第一个和第二个问题应该是“Type1”,第三个问题应该是“Type2”,第四个应该是“Type3”,第五个应该是“Type1”

我的想法是实现它:

async.parallel({
    Type1: function(callback) {
        Question.find({}, {
            questionType: "Type1"
        }).limit(3).exec(function (err, questions) {
            callback(null, questions)
        })
    },
    Type2: function(callback) {
        Question.find({}, {
            questionType: "Type2"
        }).limit(1).exec(function (err, questions) {
            callback(null, questions)
        })
    },
    Type3: function(callback) {
        Question.find({}, {
            questionType: "Type3"
        }).limit(1).exec(function (err, questions) {
            callback(null, questions)
        })
    },
},
function(err, results) {
    // Take all results here order it as per requirement and return
    //results.Type1, results.Type2, results.Type3
    // return the result in required order.
})

但我知道这不是有效的方法。当它执行3个查询时,之后也必须更改订单。

问题:最好/更好的方法是什么?

提前致谢:)

1 个答案:

答案 0 :(得分:1)

有多种方法可以做到这一点。最简单的方法是skip()随机数量的文档,然后使用limit(1)从集合中获取文档。

如果您要删除大量文档,这可能会很昂贵。

另一个解决方案是为每个问题类型生成一个唯一的整数字段(例如MySQL中的自动增量)。