2015-11-02 4 views
1

Это мой первый вопрос, задающий вопрос о StackOverflow, и я прошу прощения за то, что он более или менее повторен или если я что-то написал неправильно. Я пытаюсь выполнить код в Random record from MongoDB, но все еще пытаюсь извлечь 4 случайных записи из моего MongoDB в узле.Случайные записи от MongoDB

В оболочке Монго, я могу успешно получить 4 случайные записи с этим:

db.reccs.find({ genre: { $in: ['fantasy']} }).limit(4).skip(Math.random() * db.reccs.count({ genre: { $in: req.query.test} })) 

Однако в моем Node.js server.js файл, этот код не возвращает никаких ошибок и первые 4 записи он находит , а не случайные 4:

app.get('/comics', function(req, res) { 
    var comics = db.collection('reccs').find({ genre: { $in: req.query.test} }).limit(4).skip(Math.random() * db.collection('reccs').count({ genre: { $in: req.query.test} })).toArray(function(error, comics) { 
    if (error) {console.dir(error+"error!")} 

    res.send(comics) 
}) }) 

Я полностью тупик, так что я бы признателен за любые мысли о том, почему это работает в оболочке Монго, но не в server.js. Спасибо!

Редактировать - Я считаю, что этот вопрос отличается от того, что речь идет не о оболочке Mongo, но Node.js - решение в связанном вопросе абсолютно работает в оболочке, а не в Node.js.

Редактировать 2 - Если кто-нибудь когда-либо сталкивался с этим, этот MongoDB count() undefined вместе с комментарием ниже должен помочь!

+1

Доступ MongoDB в node.js является асинхронным, поэтому вам необходимо предоставить обратный вызов 'count', чтобы получить результат. Только после этого вы можете сделать следующий запрос 'find'. – JohnnyHK

+0

Спасибо @JohnnyHK, получил его работу! – Victoria

ответ

1

Math.random() * некоторое количество не даст вам целое ...

console.log(Math.random() * 22) 
// 12.282829137984663 

Поэтому ваш пропуск (вероятно) никогда не выполняется. Попробуйте

var numRecordsToSkip = Math.round(Math.random() * numRecords, 0) 
.limit(4).skip(numRecordsToSkip) ... 
+0

Примечание: 'var numRecordsToSkip = ~~ (Math.random() * numRecords);' преобразуется в integer быстрее –

+0

@MiKeBu очень интересный подход - никогда не знал, что вы можете сделать это таким образом. – jpaljasma

Смежные вопросы