2017-02-27 2 views
1

Ich habe ein Projekt node.js und ich brauche 8 zufällige Dokumente, die nicht sequentiell von meiner MongoDB-Datenbank mit Mungo sind.Mongoose zufällige Dokumente nicht sequentiell

Mein Schema:

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

Wenn die Funktion in meiner Route-Datei (main.js) Aufruf:

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

Wie würde ich rufen Sie die Funktion 'finden' in meinem Modell von meinem Haupt .js Routendatei?

+0

Mögliche Duplikat von [Wie zufälligen Datensatz in Mongoose finden] (http://stackoverflow.com/questions/39277670/how- zu-find-random-record-in-mongoose) –

+0

@BertrandMartel Ich habe meine Frage mit einem Arbeitsmodell aktualisiert, aber wüssten Sie, wie ich die Modellfunktion von meiner Router-Datei aufrufen würde, um die Daten in der Ansicht zu rendern ? – user

Antwort

0

Sie die folgenden Befehle verwenden könnten Unikate mit $sample aber Gruppierung von _id entfernen möglichen Duplikate im Zufallsergebnis zu erhalten:

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

Für die Struktur des Codes, können Sie ein static methodgetRandomItems definieren könnten, Speicherung Ihr Mungo Objekt in Express app.db und das Mungo-Objekt aus Ihrem Router mit req.app.db Aufruf:

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); 
      } 
     }); 
    }); 
}; 
Verwandte Themen