MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak możemy stworzyć automatycznie generowane pole dla mongodb za pomocą wiosennego rozruchu?

MongoDB ma wszystkie zaawansowane funkcje generowania ObjectId, ale często po prostu przeskakujesz statek z relacyjnej bazy danych i nadal potrzebujesz łatwego do odczytania / przekazania pola identyfikatora numerycznego, które automatycznie zwiększa się za każdym razem, gdy wstawiany jest nowy rekord.

Jedną z fajnych sugestii z samouczka MongoDB jest użycie kolekcji liczników z „nazwa licznika” jako identyfikatorem i polem „seq” do przechowywania ostatnio używanego numeru.

Podczas programowania przy użyciu Spring Data MongoDB ten fajny trik można napisać jako prostą usługę. Tutaj użyłem nazwy kolekcji jako nazwy licznika, więc łatwo ją odgadnąć / zapamiętać.

import static org.springframework.data.mongodb.core.FindAndModifyOptions.options;
import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query.query;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import com.model.CustomSequences;


@Service
public class NextSequenceService {
    @Autowired private MongoOperations mongo;

    public int getNextSequence(String seqName)
    {
        CustomSequences counter = mongo.findAndModify(
            query(where("_id").is(seqName)),
            new Update().inc("seq",1),
            options().returnNew(true).upsert(true),
            CustomSequences.class);
        return counter.getSeq();
    }
}

CustomSequences to po prostu prosta klasa reprezentująca kolekcję. Proszę uważaj na użycie typu danych int, to ograniczy się do maksymalnie 2^31 wpisów.

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "customSequences")
public class CustomSequences {
    @Id
    private String id;
    private int seq;

// getters and setters
}

Następnie podczas wstawiania nowego wpisu (z pomocą obsługi Spring MongoDB Repository), po prostu ustaw pole id w ten sposób, zanim go zapiszesz

BaseQuestion baseQuestion = new BaseQuestion();
baseQuestion.setQuestionId(nextSequenceService.getNextSequence("customSequences"));
/* Rest all values */

baseQuestionRepository.save(baseQuestion);

Jeśli nie podoba ci się ten sposób, musisz użyć MongoDBEvents i użyć onBeforeConvert do wygenerowania automatycznej wartości przy użyciu tego samego powyższego podejścia.

Również powyższe podejście jest bezpieczne wątkowo, ponieważ findAndModify() jest bezpieczną wątkowo metodą atomową




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Automatyzacja MongoDB za pomocą SaltStack

  2. Mongo Query pytanie $gt,$lt

  3. mgo - wydajność zapytań wydaje się stale niska (500-650ms)

  4. Korzystanie z AngularJs i MongoDB/Mongoose

  5. Jak przetestować aktualizacje aplikacji MongoDB?