2014-09-22 18 views

Odpowiedz

23

Aktualizacja 2: Oryginalny odpowiedź, jak również pierwsza aktualizacja, błędnie odwołać dokumentacji powłoki Mongo zamiast API Javy.

W języku Java DBCollection.ensureIndex() został wycofany w wersji 2.12 i usunięty w wersji 3.0. DBCollection.createIndex() jest tym, który powinien zostać użyty.

Aktualizacja:
db.collection.ensureIndex() jest przestarzałe od wersji 3.0.0.
Jest teraz aliasem dla db.collection.createIndex().

oryginalny:
createIndex() jest deprecated since 1.8

Był on używany do tworzenia indeksów na zbiorach natomiast ensureIndex() tworzy indeks na określonym dziedzinie jeśli indeks nie istnieje. Ponadto, gdy wykonujemy createIndex() dwukrotnie drugie wykonanie będzie tylko nie natomiast z ensureIndex() można wywołać ją wiele razy i będzie nie powiedzie

i jeszcze jedno, że zmienili dotyczące zachowania ensureIndex(), w poprzednich wersjach mongodb (wersje mniejsze niż 2.6), jeśli pozycja indeksu dla istniejącego dokumentu przekroczy maksymalną długość indeksu, zostanie utworzony indeks , ale Mongodb nie będzie indeksował takich dokumentów w postaci, podczas gdy w ostatniej wersji nie zostanie utworzony indeks.

+15

Według [mongodb docs] (http://docs.mongodb.org/manual/reference/method/db.collection.ensureIndex/) 'ensureIndex()' jest przestarzałe. – KPrince36

+1

'createIndex' będzie w rzeczywistości łagodny (przynajmniej w wersji 3.0). Podczas kolejnych wywołań zwróci "ok", ale także "uwaga" stwierdzająca, że ​​"wszystkie indeksy już istnieją" – PeterM

14

W języku Java API DBCollection.ensureIndex() jest przestarzałe , dokładnie odwrotnie niż "normalny" interfejs API MongoDB (w momencie odpowiedzi). Aktualizacja: Ta niezgodność prawdopodobnie została rozwiązana, a teraz db.collection.createIndex() zastępuje także db.collection.ensureIndex() w powłoce Mongo.

Jak widać w https://jira.mongodb.org/browse/JAVA-1097 w Javie (co PO pytani o) ensureIndex() została zaniechana w wersji 2.12.0 sterownika Java i DBCollection.createIndex() jest jeden trzeba użyć. DBCollection.ensureIndex() (link do wersji 2.12) nie jest już dostępny w API Java DBCollection.

+0

Btw, nie mogę skomentować błędnej odpowiedzi @ sol4me z powodu braku reputacji, ani nie wskrzeszać błędnie skasowanego oryginału odpowiedź, lub zrobić cokolwiek innego w tej sprawie. :-( –

+0

Jeśli uważasz, że masz rację, opublikuj dobrze napisaną odpowiedź, nie taką bezużyteczną odpowiedź, która zostanie na pewno usunięta – Dici

+2

Przykro mi, ale co jest bezużyteczne w mojej odpowiedzi? że @ sol4me pomylili się, a w Java API faktycznie musisz użyć createIndex(). Odwołuję się nawet do odpowiedniego problemu JIRA, gdzie udało mi się to wyjaśnić z deweloperami MongoDB ... Jeśli kiedykolwiek otrzymałem odpowiedź od Ci, którzy skasują moją odpowiedź, edytowaliby ją i nie zostawili tam wszystkich rzeczy, aby pokazać, jak to zostało usunięte. "To wszystko jest dla mnie wyjątkowo wrogie, po tym, jak nawet starałem się omówić sprawy z programistami, więc Mogę podać poprawną odpowiedź: –

1

Metoda znaleziona w sterowniku java (wersja 2.22 i starsza) buforowałaby przechowywanie indeksu w kolekcji. Ponieważ wielu klientów może potencjalnie zmienić indeksy kolekcji, wartość pamięci podręcznej może być czasami błędna, a sterownik nie może utworzyć brakującego indeksu.

Z tego powodu sterownik java zaimplementował metodę createIndex z identycznym zachowaniem, z tym wyjątkiem, że nie buforuje stanu indeksu.

Ze sterownikami 2.12 i nowszych, można zastąpić ensureIndex przez createIndex i oczekiwać tego samego zachowania, z wyjątkiem uderzenia wydajności, w którym kierowca wcześniej sądził, że indeks już istnieje i powraca bez wysyłania komendy createIndex do serwera mongo.

Co do tego, dlaczego nie zmienili zachowania bez zmiany nazwy - nie mam pojęcia.

Powiązane problemy