2011-10-19 11 views
23

Czy możesz użyć mongodump do zrzutu najnowszych dokumentów "x" z kolekcji? Na przykład w powłoce Mongo można wykonać:Czy można mongodumpować ostatnie rekordy "x" z kolekcji?

db.stats.find().sort({$natural:-1}).limit(10); 

Czy ta sama możliwość jest dostępna dla mongodump?

Domyślam się, że obejście tego problemu polegałoby na zrzuceniu powyższych dokumentów do nowej kolekcji tymczasowej i mongodumpowaniu całej kolekcji tymczasowej, ale byłoby wspaniale po prostu móc to zrobić za pośrednictwem mongodump. Funkcja

Dzięki z góry,

Michael

+0

podobne wymagania, ale chcę najnowsze rekordy n dla każdej kolekcji do konfiguracji dev/serwerze testowym . – Yarco

Odpowiedz

37

nie eksponuje w pełni interfejsów kursora. Ale można obejść to, używając parametru --query. Pierwszy uzyskać całkowitą liczbę dokumentów z kolekcji

db.collection.count() 

Powiedzmy istnieje 10000 dokumenty i chcesz ostatnią 1000. celu należy uzyskać identyfikator pierwszego dokumentu, który chcesz zrzucić.

db.collection.find().sort({_id:1}).skip(10000 - 1000).limit(1) 

W tym przykładzie identyfikator to "50ad7bce1a3e927d690385ec". Teraz możesz nakarmić mongodump tymi informacjami, aby zrzucić wszystkie dokumenty o wyższym lub równym id.

$ mongodump -d 'your_database' -c 'your_collection' -q '{_id: {$gte: ObjectId("50ad7bce1a3e927d690385ec")}}' 

UPDATE Nowe parametry --limit i --skip dodano mongoexport będzie prawdopodobnie dostępna w następnej wersji narzędzia: https://github.com/mongodb/mongo/pull/307

+1

Bardzo inteligentna odpowiedź ... nice one! –

+2

'db.collection.find(). Sort ({_ id: -1}) skip (1000) .limit (1)' również robi lewę i ma premię, której nie trzeba powtarzać we wszystkich poprzednich rekordach. – RickyA

+0

Również w 'mongodump' line:' $ lte' powinno być '$ gte'. – RickyA

0

Znalezisko() ma opcjonalny drugi parametr, który określa, które klawisze mają być zwrócone. Specjalny operator "slice" może być użyty do zwrócenia podzbioru elementów dla klucza tablicy.

Na przykład, jeśli chcemy, aby powrócić 10 pierwszych komentarzy na temat kolekcji bloga (na przykład), możemy zrobić to:

db.blog.posts.find(criteria, {"comments" : {"$slice" : 10}}) 

Alternatywnie, jeśli chcemy, aby powrócić 10 ostatnich komentarzy, możemy użyć -10:

db.blog.posts.find(criteria, {"comments" : {"$slice" : -10}}) 

Mam nadzieję, że to ci się przyda.

Powodzenia!

4

mongodump supports the --query operator. Jeśli możesz określić swoje zapytanie jako zapytanie json, powinieneś być w stanie to zrobić.

Jeśli nie, to Twoja sztuczka polegająca na uruchomieniu zapytania powoduje zrzucenie rekordów do kolekcji tymczasowej, a następnie odrzucenie, które działa dobrze. W tym przypadku można zautomatyzować zrzut za pomocą skryptu powłoki, który wywołuje polecenie mongo za pomocą polecenia javascript, aby wykonać to, co chcesz, a następnie wywołanie mongodump.

+1

prawo, program mongodump pozwoli na zapytanie, ale nie pozwalają na dodawanie limitu. Dzięki za potwierdzenie mojej drugorzędnej logiki, w końcu to się skończyło. –

+0

aktualizowane Link: http://docs.mongodb.org/manual/reference/mongodump/ – ericsoco

0

I grał z podobnym wymogu (używając mongodump) gdzie Chciałem wykonać sekwencyjne tworzenie kopii zapasowych i przywracanie. Zrobiłbym zrzut z ostatnio zapisanego znacznika czasu. nie mogłem dotrzeć --query '{TIMESTAMP: {$ gte: $ stime, $ lt: $ Etime}}'

Niektóre punkty do uwaga: 1) używać apostrof zamiast podwójnego 2) nie uciekajcie ani $ ani nic takiego, jeśli zastąpienie $ stime/$ etime rzeczywistymi liczbami sprawi, że zapytanie zadziała 4) problem polegał na tym, że otrzymałem $ stime/$ etime, zanim mongodump wykonał sam siebie pod -x pokazał jako + eval mongodump --query {TIMESTAMP {\ gte $: $ utc_stime \ $ LT: $ utc_etime}} ' ++ mongodump --query {TIMESTAMP: $ gte: 1366700243} {TIMESTAMP: $ LT : 1366700253}”

Piekło, problem był oczywisty. zapytanie zostanie przekonwertowane na dwa warunki.

Rozwiązanie jest trudne i mam je po wielokrotnych próbach .... escape {and} ie use {..}. To rozwiązuje problem.

3

budynku off odpowiedzi Mic92, w celu uzyskania jak największej liczby 1000 elementów z kolekcji:

Znajdź _id w 1000. ostatniej pozycji:

db.collection.find('', {'_id':1}).sort({_id:-1}).skip(1000).limit(1)

To będzie coś jak 50ad7bce1a3e927d690385ec .

Następnie przekazać tę _id w zapytaniu do mongodump:

$ mongodump -d 'your_database' -c 'your_collection' -q '{_id: {$gt: ObjectId("50ad7bce1a3e927d690385ec")}}'

+0

Drobne poprawki: ten kod zrzuca 1001 rekordów. Możesz zastąpić $ gte przez $ gt. –

0

spróbuj tego:

NUM=10000  
doc=selected_doc 
taskid=$(mongo 127.0.0.1/selected_db -u username -p password --eval "db.${doc}.find({}, {_id: 1}).sort({_id: -1}).skip($NUM).limit(1)" | grep -E -o '"[0-9a-f]+"') 
mongodump --collection $doc --db selected_db --host 127.0.0.1 -u username -p password -q "{_id: {\$gte: $taskid}}" --out ${doc}.dump 
Powiązane problemy