Chcę utworzyć funkcję Schema.statics.random
, która dostarczy mi losowy element z kolekcji. Wiem, że istnieje przykład dla macierzystego sterownika MongoDB, ale nie mogę go uruchomić w Mongoose.Losowy dokument z kolekcji w Mongoose
Odpowiedz
Znalazłem tę statyczną funkcję schematu mangusty w geście GitHub, który powinien osiągnąć to, czego szukasz. Zlicza liczbę dokumentów w kolekcji, a następnie zwraca jeden dokument po pominięciu losowej kwoty.
QuoteSchema.statics.random = function(callback) {
this.count(function(err, count) {
if (err) {
return callback(err);
}
var rand = Math.floor(Math.random() * count);
this.findOne().skip(rand).exec(callback);
}.bind(this));
};
Źródło: https://gist.github.com/3453567
NB ja zmodyfikował kod trochę aby uczynić go bardziej czytelnym.
Zaimplementowałam wtyczkę dla mangusty, która robi to w bardzo wydajny sposób przy użyciu zapytania $ near na dwóch losowo wygenerowanych współrzędnych przy użyciu indeksu 2dsphere. Sprawdź to tutaj: https://github.com/matomesc/mongoose-random.
Jeśli nie chcesz dodawać kodu "testowego" do swojego schematu, używa to zapytań Mongoose.
Model.count().exec(function(err, count){
var random = Math.floor(Math.random() * count);
Model.findOne().skip(random).exec(
function (err, result) {
// result is random
});
});
Znalazłem to łatwe do wdrożenia – chris31389
Co powiesz na wiele dokumentów w jednym zapytaniu. Czy istnieje inne, łatwiejsze rozwiązanie niż wielokrotne wysyłanie zapytań? – codersaif
@codersaif To nie jest to, czego chcesz użyć do tego. Funkcja pominięcia jest kierowana na paginację i jest kursorem, [kursorem mongody] (https://docs.mongodb.com/manual/reference/method/cursor.skip/). Spowoduje to przesunięcie kursora do określonej pozycji i będzie czytane do przodu. Kod w mojej odpowiedzi to w zasadzie paginacja, 'Model.findOne(). Skip (100) .limit (1) .exec()' ale pobiera pojedynczy dokument. –
- 1. findOne dokument podrzędny w Mongoose
- 2. Mongoose wypełnić sub-sub dokument
- 3. Mongoose - wiele schematów z zastosowaniem pojedynczej kolekcji
- 4. Jak usunąć dokument z zamkniętej kolekcji?
- 5. Node + ekspresowe Mongoose Sub Collection Dokument Insert
- 6. Aktualizacja mongoose aktualizuje tylko pierwszy dokument
- 7. Zwiększenie jednego pola w kolekcji MongoDB z Mongoose
- 8. Jak pobrać dokument macierzysty na podstawie wartości poddokumentu w Mongoose?
- 9. Mongoose Model.remove (oddzwanianie) nie usuwa niczego z mojej kolekcji
- 10. Meteor - Znajdź dokument z kolekcji poprzez Mongo ObjectId
- 11. Aktualizacja wsadowa z Mongoose
- 12. Jak usunąć dokument podrzędny wewnątrz obiektu za pomocą Mongoose
- 13. Jak uzyskać konkretny dokument osadzony w kolekcji MongoDB?
- 14. Usuń osadzony dokument w mangecie
- 15. Znajdź dokument z identyfikatorem obiektu w mongoDB
- 16. Sprawdź istniejący dokument w Mongo
- 17. Czy Mongoose rzeczywiście potwierdza istnienie identyfikatora obiektu?
- 18. Wyszukiwanie obiektów osadzonych w Mongoose
- 19. Mongoose/MongoDB - Prosty przykład dodanie do tablicy obiektów dokument, o zdefiniowanym schemacie
- 20. Obsługa błędów z Mongoose
- 21. Mongoose - Przyrost z findOne
- 22. Zapisywanie obiektu Mongoose w dwóch kolekcjach
- 23. Mongoose, Wybór konkretnego pola z find
- 24. Wypełnianie tablicy ObjectId w Mongoose
- 25. losowy element w numpy
- 26. RavenDB. Jak załadować dokument z tylko 5 przedmiotami z wewnętrznej kolekcji?
- 27. Losowy wybór z pliku CSV w Jmeter
- 28. Jak zaktualizować dokument wbudowany w mangusta?
- 29. Jak przechodzić rekursywnie dokument zagnieżdżony w MongoDB
- 30. Mongoose powrót zapytanie zerowy
Cool. Wiesz, jak to może być przeniesione na CoffeeScript? – user1680104
Nie, przepraszam! Muszę jeszcze nauczyć się pisać CoffeeScript. – matthewtole
Okay, to nie działało, więc nie byłem pewien (to był problem w pierwszym przypadku), ale ponieważ wciąż napotykam problem z wbudowanym Javscript. To dość dziwne. Funkcja wewnątrz funkcji (wywołanie zwrotne) {} nigdy nie jest wywoływana. Może jakiś problem z połączeniem DB. Spróbuję to rozgryźć. – user1680104