2017-02-27 79 views
1

我有一個node.js項目,我需要從我的mongoDB數據庫使用Mongoose獲得8個隨機文件。Mongoose隨機文件非順序

我的架構:

var mongoose = require('mongoose'); 
var random = require('mongoose-simple-random'); 


var schema = new mongoose.Schema({ 
    title: String, 

    width:String, 
    height:String, 

}); 
var Images = mongoose.model('Images', schema); 


Images.count().exec(function (err, count) { 

    // Get a random entry 
    var random = Math.floor(Math.random() * count) 

    // Again query all users but only fetch one offset by our random # 
    Images.find({}).limit(8).skip(random).exec(
    function (err, result) { 
     // Tada! random user 
     console.log(result) 
     //res.send(results); 
    }) 
}) 

module.exports = { 
    Images: Images 
}; 

當調用我的路由文件(Main.js)功能:

var Images = require('../models/images.js'); 



app.get('/homepage', function(req, res){ 
    var rand = Math.floor(Math.random() * 10000); 
    Images.find({}).limit(8).skip(rand).exec(function(err, docs){ 

     res.render('homepage', {images: docs}); 
    }); 
}); 

我怎麼會叫我的模型中的「查找」功能,從我的主.js路由文件?

+0

的可能的複製[如何找到貓鼬隨機記錄(http://stackoverflow.com/questions/39277670/how-在尋找隨機記錄在貓鼬) –

+0

@BertrandMartel我已經更新了我的問題與工作模型,但你會知道我怎麼會從我的路由器文件調用模型函數,以呈現視圖中的數據? – user

回答

0

你可以使用以下方法來獲取與$sample獨特的項目,而是由_id分組去除隨機結果可能重複:

db.images.aggregate([{ 
    $sample: { size: 100 } 
}, { 
    $group: { 
     _id: "$_id", 
     document: { $push: "$$ROOT" } 
    } 
}, { 
    $limit: itemCount 
}, { 
    $unwind: "$document" 
}]) 

爲了您的代碼的結構,你可以定義一個static methodgetRandomItems,存儲快遞app.db,並要求從你的路由器貓鼬對象的貓鼬的對象與req.app.db

model.js

'use strict'; 

exports = module.exports = function(app, mongoose) { 

    var schema = new mongoose.Schema({ 
     title: String, 

     width: String, 
     height: String, 

    }); 

    schema.statics.getRandomItems = function(itemCount, cb) { 

     this.aggregate([{ 
      $sample: { size: 100 } 
     }, { 
      $group: { 
       _id: "$_id", 
       document: { $push: "$$ROOT" } 
      } 
     }, { 
      $limit: itemCount 
     }, { 
      $unwind: "$document" 
     }], cb); 
    }; 

    app.db.model('Images', schema); 
}; 

app.js

'use strict'; 

var mongoose = require('mongoose'), 
    express = require('express'); 

var app = express(); 

app.db = mongoose.createConnection("mongodb://localhost/testDB"); 

// config data models 
require('./models')(app, mongoose); 
require('./routes')(app); 

app.listen(8080, function() { 

}); 

routes.js

'use strict'; 

exports = module.exports = function(app) { 

    // BboxAPI 
    app.get("/random", function(req, res) { 

     req.app.db.models.Images.getRandomItems(8, function(err, result) { 
      if (err) { 
       console.log(err); 
       res.status(500).json(err); 
      } else { 
       res.status(200).json(result); 
      } 
     }); 
    }); 
};