MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как можем да създадем автоматично генерирано поле за mongodb, използвайки spring boot

MongoDB се предлага с всички усъвършенствани функции за генериране на ObjectId, но често просто прескачате кораба от релационна база данни и все още искате лесно за четене/общуване поле за числов идентификатор, което автоматично се увеличава всеки път, когато се вмъкне нов запис.

Едно красиво предложение от урока на MongoDB е да използвате колекция от броячи с „име на брояча“ като идентификатор и поле „seq“ за съхраняване на последното използвано число.

Когато разработвате с помощта на Spring Data MongoDB, този чист трик може да бъде написан като проста услуга. Тук използвах името на колекцията като име на брояча, така че е лесно да се отгатне/запомни.

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 е просто прост клас, представляващ колекцията. Моля, внимавайте с използването на тип данни int, това ще ограничи до максимум 2^31 записа.

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
}

След това, когато вмъквате нов запис (с помощта на поддръжката на Spring MongoDB Repository), просто задайте полето за идентификатор по този начин, преди да го запазите

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

baseQuestionRepository.save(baseQuestion);

Ако не ви харесва този начин, тогава трябва да използвате MongoDBEvents и да използвате onBeforeConvert, за да генерирате автоматизирана стойност, като използвате същия подход по-горе.

Също така подходът по-горе е безопасен за нишки, тъй като findAndModify() е атомен метод, безопасен за нишки




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $replaceAll

  2. Актуализиране на полето със стойност на друго поле в документа

  3. mongo.so:> недефиниран символ:php_json_encode в Unknown на ред 0. След инсталиране mongo драйвер за php

  4. Самоподписана SSL връзка с помощта на PyMongo

  5. Множество групови операции, използващи рамката за агрегиране на Mongo