2013-07-08 16 views
5

Mam problem z zapytaniem o aktualizację przy użyciu Spring Data MongoDB. Pobieram obiekt _id jako wartość BigInteger. Następnie chcę zrobić następujące zapytanie:Dane źródłowe MongoDB: Konwersja BigInteger do ObjectId

Query query = new Query(Criteria.where("_id").is(id)); 
Update update = new Update(); 
update.set("version",version); 
mongoOperations.updateFirst(query, update, Audit.class); 

część Zapytanie nie pasuje do żadnego dokumentu od czasu wartości id przekazany do is() jakoś muszą być przeliczone na objectID. Nie mogę znaleźć żadnej dokumentacji dotyczącej tego rodzaju konwersji. Doceni każdą pomoc.

p.s .: SpringData MongoDB wersja 1.2

+0

widzę też, że próbujesz wykonać jakąś wersjami. Chciałbym ci przekazać [to pytanie] (http://stackoverflow.com/questions/16665797/spring-data-version-annotation-not-incrementing-when-used-on-a-gogo-collection), że poprosił o ponowne sprawdzenie za pomocą wiosennego mongo, jak również o skonfigurowanie automatycznej wersji za pomocą adnotacji. –

+0

Dzięki, ale jestem zadowolony z mojej wersji :-) –

Odpowiedz

1

Prawdopodobnie chcesz napisać niestandardową konwertera wiosna BigInteger => ObjectId i ObjectId => BigInteger.

Patrz część doc tutaj: http://static.springsource.org/spring-data/data-document/docs/current/reference/html/#d0e2670

------ UPDATE ------

Wydaje się, że ten rodzaj konwertera istnieje już w sezonie wiosna-Dane- Biblioteka MongoDB: http://static.springsource.org/spring-data/data-document/docs/1.0.0.M1/api/org/springframework/data/document/mongodb/SimpleMongoConverter.ObjectIdToBigIntegerConverter.html

Musisz więc podać ją w konfiguracji Spring.

+0

Łatwiej powiedzieć, niż zrobić :-). Znalazłem tę klasę w dokumentacji do wersji 1.0 Spring Data. Ale wspomniałem wersję danych Spring z jakiegoś powodu - o ile widzę, nie ma takiego konwertera w 1.2. –

1

Ewentualnie można dodać pole „id” do swoich klas zbiórki lub potencjalnie klasy bazowej i opisywanie go org.springframework.data.annotation.Id, jak poniżej:

import org.springframework.data.annotation.Id; 

public abstract class BaseDocument { 

    @Id 
    protected long id; 

to pozwolisz do wykonywania zapytania w postaci:

public boolean doesDocumentExist(Class clazz, long documentId) { 
    Query queryCriteria = new Query(Criteria.where("id").is(documentId)); 
    return mongoTemplate.count(queryCriteria, clazz) == 1; 
} 

adnotacji własne pole id z „@Id” będzie przechowywać swój identyfikator jako Mongo objectID zatem oszczędność cię od robienia konwersji samodzielnie.

+1

Dostajesz coś nie tak. Mam pole @Id na polu BigInteger w mojej encji. A Spring Data naprawdę zapisuje ten BigInt jako ObjectId. Ale ... Problem nie polega na oszczędzaniu, ale na przekazywaniu wartości zapytaniu. –

+0

@AleksandrKravets W porządku, wszystko, co musisz zrobić w zapytaniu, to zastąpienie "_id" dowolną nazwą Twojego identyfikatora z przypisanym polem: tj.jeśli twoje pole identyfikatora ma nazwę "id", tak jak w moim przykładzie, po prostu zmień swoje kryteria w następujący sposób: Criteria.where ("id"). is (id) –

+0

Nie, nie działa. Jak już wspomniałem, problem nie występuje w polu. Jest to typ wartości i brak automatycznej konwersji. –

6

Można go również przekształcić ręcznie:

ObjectId convertedId = new ObjectId(bigInteger.toString(16)); 
Query query = new Query(Criteria.where("_id").is(convertedId)); 
0
//get the converter from the mongoTemplate 

MappingMongoConverter converter = (MappingMongoConverter)mongoTemplate.getConverter(); 

//get the conversion service from the mongo converter 

ConversionService conversionService = converter.getConversionService(); 

//iterate the status list and get the each id to add the arraylist 

for(Status status: statusList){ 

    ObjectId objectIdVal = conversionService.convert(status.getId(), ObjectId.class); 

    **//here status.getId() returns the BigInteger** 
    statusArrayList.add(objectIdVal);   
} 

//get the users list whose status is active and cancel 

query.addCriteria(new Criteria().where("status.$id").in(statusArrayList)); 

List<User> usersList = mongoTemplate.find(query, User.class); 
0

można przekonwertować BigIngeter do ObjectId pomocą reprezentację hex z BigInteger. Jednak kod ObjectId ma dokładnie 24 znaki, a przetwarzanie krótszego łańcucha zakończy się niepowodzeniem w Javie. Tak więc lepiej upewnić się, że reprezentacja hex jest 0-usztywniane odpowiednio:

String hexString24 = StringUtils.leftPad(bigInteger.toString(16), 24, "0"); 
ObjectId convertedId = new ObjectId(hexString24); 
Query query = new Query(Criteria.where("_id").is(convertedId)); 
Powiązane problemy