Mam kolekcję mongo z dokumentami. W każdym dokumencie znajduje się jedno pole, które wynosi 0 LUB 1. Potrzebuję losowej próbki 1000 rekordów z bazy danych i policz liczbę dokumentów, które mają to pole jako 1. Muszę wykonać to próbkowanie 1000 razy. Jak mam to zrobić ?Losowe pobieranie próbek z Mongo
Odpowiedz
Oto przykład, w powłoce mongo
.. zakładając kolekcję collname
, a wartość zainteresowania thefield
:
var total = db.collname.count();
var count = 0;
var numSamples = 1000;
for (i = 0; i < numSamples; i++) {
var random = Math.floor(Math.random()*total);
var doc = db.collname.find().skip(random).limit(1).next();
if (doc.thefield) {
count += (doc.thefield == 1);
}
}
To również odpowiada na jedno inne pytanie: w przeciwieństwie do SQL, MongoDB nie ma wbudowanej funkcji do tego naprawdę.Również ten pominięcie może (... może) stać się kłopotliwym dla większych losowych wartości, zależy jednak. – Sammaye
Chciałem zmienił mój komentarz na @Stennies odpowiedzieć z tym ale można również użyj indeksu auto-rosnącego auto-indeksu jako alternatywy, jeśli masz pominąć OGROMNE ilości rekordów (mówisz tu ogromnie).
napisałem kolejną odpowiedź na inne pytanie dużo jak ten, gdzie ktoś próbował znaleźć n-ty rekord kolekcji:
php mongodb find nth entry in collection
Druga połowa moją odpowiedź w zasadzie opisuje jedną potencjalną metodę którym mógłbyś podejść do tego problemu. Nadal trzeba pętli 1000 razy, aby uzyskać losowy wiersz oczywiście.
Dla wersji MongoDB 3.0 i wcześniej używam starej sztuczki z dni SQL (która, jak myślę, wykorzystuje Wikipedia dla ich funkcji losowej strony). Przechowuję losową liczbę od 0 do 1 w każdym obiekcie, który potrzebuję do randomizacji, nazwijmy to pole "r". Następnie dodajemy indeks do "r".
db.coll.ensureIndex(r: 1);
Teraz, aby dostać losowa X obiektów, należy użyć:
var startVal = Math.random();
db.coll.find({r: {$gt: startVal}}).sort({r: 1}).limit(x);
To daje przypadkowych przedmiotów w jednym zapytaniu find. W zależności od twoich potrzeb może to być przesada, ale jeśli masz zamiar robić dużo próbkowania w czasie, jest to bardzo skuteczny sposób bez obciążania twojego backendu.
Świetnie! Bardzo mądry! –
eleganckie rozwiązanie! –
Jeśli używasz mongoingu, możesz użyć SequenceField do wygenerowania przyrostowego licznika.
class User(db.DynamicDocument):
counter = db.SequenceField(collection_name="user.counters")
Następnie pobrać losową listę powiedzieć 100, wykonaj następujące czynności
def get_random_users(number_requested):
users_to_fetch = random.sample(range(1, User.objects.count() + 1), min(number_requested, User.objects.count()))
return User.objects(counter__in=users_to_fetch)
gdzie można by nazwać
get_random_users(100)
Dla osób przybywających do odpowiedzi, należy teraz używać nowa funkcja agregacji $sample
, nowa w 3.2.
https://docs.mongodb.org/manual/reference/operator/aggregation/sample/
db.collection_of_things.aggregate(
[ { $sample: { size: 15 } } ]
)
Następnie dodać kolejny krok do Podliczam 0
s i 1
s używając $group
aby uzyskać zliczania. Here is an example from the MongoDB docs.
- 1. Pobieranie próbek DirectShow na Windows 8
- 2. python: pobieranie próbek bez zamiany z siatki 2D
- 3. Pobieranie próbek w r bez następujących po sobie identycznych cyfr
- 4. FFT/IFFT: Pobieranie próbek Częstotliwość i długość sygnału
- 5. Jak zezwolić na pobieranie próbek JMeter http sampler?
- 6. Algorytm do pobierania próbek bez wymiany?
- 7. Iteratywne losowe szkolenie lasu
- 8. losowe zdarzenie mongorestore (błąd krytyczny)
- 9. Grupa Mongo $ z projektem $
- 10. Losowe liczby Java nie są losowe?
- 11. Pobieranie próbek w centrach texel nie daje właściwych rezultatów, OpenGL, C++
- 12. losowanie warstwowe z lasy losowe w R
- 13. Otrzymuj losowe rekordy z Doctrine
- 14. Wybieranie losowe wartości z słownika
- 15. Wprowadzanie próbek dla różnych algorytmów
- 16. Jak zwiększyć rozmiar próbek kodu?
- 17. Mongo - Ignoruj właściwość z utrwalania
- 18. Mongo - rubinowy problem z połączeniem
- 19. usuń _id z Mongo spowodować
- 20. Przeczytaj plik z powłoki mongo
- 21. Wyszukiwanie tekstu mongo z mangustą
- 22. odinstalowywanie mongo
- 23. PHP Mongo: Wskazówka: Mongo :: __ construct(): analizowania serwery
- 24. Wyjątek Mongo
- 25. Mongo Authentication
- 26. Jak wdrożyć losowe (a, b) tylko losowe (0,1)?
- 27. Prolog: Losowe etykietowanie
- 28. Losowe wybory dwóch wartości
- 29. Losowe liczby z dystrybucji Beta, C++
- 30. Wybierz losowe wierszy z tabeli mysql
Czy możesz zaakceptować odpowiedź? –
możliwy duplikat [Losowy rekord z MongoDB] (http://stackoverflow.com/questions/2824157/random-record-from-mongodb) –
Hej Aditya, czy możesz zaakceptować odpowiedź? – dalanmiller