2011-12-16 8 views
11

Mam szybkie pytanie, jaki jest szybki sposób na pobranie i usunięcie obiektu z kolekcji mongo. Oto kod, mam obecnie:MongoDB znajdowanie i usuwanie - najszybszy sposób

$cursor = $coll->find()->sort(array('created' => 1))->limit(1); 
$obj = $cursor->getNext(); 
$coll->remove(array('name' => $obj['name'])); 

jak widać powyżej, to chwyta jeden dokument z bazy danych i usunięcie go (tak, to nie jest przetwarzany ponownie). Jakkolwiek szybko to może być, potrzebuję go do szybszego działania. Wyzwanie polega na tym, że mamy do czynienia z wieloma procesami i przetwarzamy to, co znaleźli, ALE czasami dwa lub więcej procesów chwyta ten sam dokument, co powoduje duplikaty. Zasadniczo muszę to zrobić, aby dokument mógł zostać przechwycony tylko raz. Więc wszelkie pomysły będą mile widziane.

Odpowiedz

14

Peter, Trudno powiedzieć, jakie jest najlepsze rozwiązanie bez zrozumienia całego kontekstu - ale jednym z podejść, które można zastosować, jest findAndModify. Spowoduje to wysłanie zapytania do pojedynczego dokumentu i zwrócenie go, a także zastosowanie do niego aktualizacji.

Możesz użyć tego do znalezienia dokumentu do przetworzenia i jednoczesnego zmodyfikowania pola "status", aby oznaczyć je jako przetwarzane, aby inni pracownicy mogli je rozpoznać i zignorować.

Jest przykładem, że może być przydatny: http://docs.mongodb.org/manual/reference/command/findAndModify/

+0

to jest dokładnie to, czego potrzebuję. Dzięki za tonę. Ciekawe, ale jak wyglądałoby to polecenie w PHP? Obecnie zajmuję się tym, ale jeśli mógłbyś dać mi przykład, który byłby świetny. Jeśli dowiem się, jak najpierw, opublikuję kod, który wszyscy zobaczą. – PetersCodeProblems

+3

$ db-> command (array ('findandmodify' => 'CollectionName', 'sort' => array ('created' => 1), 'limit' => 1, 'remove' => true)); – PetersCodeProblems

+0

To jest polecenie dla php – PetersCodeProblems

-4

Jestem nowy mongodb i nie do końca pewien, co zapytanie stara się zrobić, ale tutaj jest jak zrobiłbym to

# suppose database is staging 
# suppose collection is data 
use staging 
db.data.remove(<your_query_criteria>) 

gdzie jest mapa i może zawierać dowolne kryteria wyszukiwania:

Nie jestem pewien, czy to ci pomoże.

7

Użyj funkcji findAndRemove udokumentowane tutaj: http://api.mongodb.org/java/current/com/mongodb/DBCollection.html

Funkcja findAndRemove pobierać i obiekt z bazy danych Mongo i usunąć go w jednym (atomowych) operacji.

findAndRemove (zapytanie, sortowanie [opcje], callback)

  • Przedmiotem zapytania jest używany do odebrania obiektu z bazy danych (patrz collection.find())
  • Parametr sortowania jest używany sortowania wyników (w przypadku wielu gdzie znaleźć)
+1

To łącze może zawierać odpowiedź, ale proszę dodać odpowiednie informacje z tego linku do swojej odpowiedzi. Linki się łamią. – rene

+1

Wygląda na to, że w MongoDB 3 API Java findAndRemove zostało zastąpione przez findOneAndDelete() 'TDocument findOneAndDelete (filtr Bsona, opcje FindOneAndDeleteOptions);' – titusn

1

robię nową odpowiedź zauważyć fakt:

Jak komentował @peterscodeproblems w fitn odpowiedź. Natywny sposób to w MongoDB teraz jest użycie

findAndModify(query=<document>, remove=True) 

Jak wskazała documentation.

Ponieważ jest rodzimy i atomowy, spodziewam się, że jest to szybszy sposób, aby to zrobić.

Powiązane problemy