{"id":9559,"date":"2013-03-08T22:00:46","date_gmt":"2013-03-08T20:00:46","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/?p=9559"},"modified":"2013-03-09T01:44:11","modified_gmt":"2013-03-08T23:44:11","slug":"mongodb-add-a-counter-with-spring-data","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html","title":{"rendered":"MongoDB: Add A Counter With Spring Data"},"content":{"rendered":"<p>In my blog app, you can view any user&#8217;s profile, for example, my profile page will be http:\/\/www.jiwhiz.com\/profile\/user1, and &#8216;user1&#8217; is my user Id in the system. In MongoDB, every document object will have a unique identifier, and often we store it as String, so I have a BaseEntity class for that:<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<\/p>\n<pre class=\" brush:java\">@Document\r\n@SuppressWarnings('serial')\r\npublic abstract class BaseEntity implements Serializable {\r\n    @Id\r\n    private String id;\r\n\u2026\r\n}<\/pre>\n<p>But the system generated id usually is very long, and I want to generate my own userId in my <code>UserAccount<\/code> class:<\/p>\n<pre class=\" brush:java\">@Document(collection = 'UserAccount')\r\npublic class UserAccount extends BaseEntity implements SocialUserDetails {\r\n    @Indexed\r\n    private String userId;\r\n\r\n    private UserRoleType[] roles;\r\n\r\n    private String email;\r\n\r\n    private String displayName;\r\n\r\n    private String imageUrl;\r\n\r\n    private String webSite;\r\n...\r\n}<\/pre>\n<p>The generated userId is very simple, just &#8216;user&#8217; with a sequence number, for example, I&#8217;m the first user, so my userId is &#8216;User1&#8217;, and the next signed up user will be &#8216;User2&#8217;, etc. I want a sequence number generator from MongoDB to give me unique sequence numbers. The operations are to return current sequence number and also increase the sequence number in the database. In MongoDB, command <a href=\"http:\/\/docs.mongodb.org\/manual\/reference\/command\/findAndModify\/\">findAndModify<\/a> automatically modifies and returns a single document. So we can use this command to query the sequence number and increase it by <a href=\"http:\/\/docs.mongodb.org\/manual\/reference\/operator\/inc\/\">$inc<\/a> function.<\/p>\n<p>First we create a Counter class to store sequence numbers for different purposes, like userId:<\/p>\n<pre class=\" brush:java\">@SuppressWarnings('serial')\r\n@Document(collection = 'Counter')\r\npublic class Counter extends BaseEntity{\r\n\r\n    private String name;\r\n\r\n    private long sequence;\r\n\r\n...\r\n}<\/pre>\n<p>Since we will use counter in a special way, there is no need to have a repository. I just create a <code>CounterService<\/code> with the method to return the next user id:<\/p>\n<pre class=\" brush:java\">public interface CounterService {\r\n    long getNextUserIdSequence();\r\n}<\/pre>\n<p>The implementation will use <a href=\"http:\/\/docs.mongodb.org\/manual\/reference\/command\/findAndModify\/\">findAndModify<\/a> to get next sequence:<\/p>\n<pre class=\" brush:java\">public class CounterServiceImpl implements CounterService {\r\n    public static final String USER_ID_SEQUENCE_NAME = 'user_id';\r\n\r\n    private final MongoTemplate mongoTemplate;\r\n\r\n    @Inject\r\n    public CounterServiceImpl(MongoTemplate mongoTemplate){\r\n        this.mongoTemplate = mongoTemplate;\r\n    }\r\n\r\n    @Override\r\n    public long getNextUserIdSequence() {\r\n        return increaseCounter(USER_ID_SEQUENCE_NAME);\r\n    }\r\n\r\n    private long increaseCounter(String counterName){\r\n        Query query = new Query(Criteria.where('name').is(counterName));\r\n        Update update = new Update().inc('sequence', 1);\r\n        Counter counter = mongoTemplate.findAndModify(query, update, Counter.class); \/\/ return old Counter object\r\n        return counter.getSequence();\r\n    }\r\n}<\/pre>\n<p>Using this approach, you can add as many sequence as you want, just create a name for it. For example, you can record visits to your web site, so add a method like <code>logVisit()<\/code>, which calls the private method <code>increaseCounter()<\/code> with a name like &#8216;visit_num&#8217;. In this example, we don&#8217;t use <a href=\"http:\/\/www.springsource.org\/spring-data\">Spring Data<\/a> Repository for <code>Counter<\/code> document, but instead use <code>MongoTemplate<\/code> directly. From my <code>MongoConfig<\/code> class, which extends <code>AbstractMongoConfiguration<\/code>, which exposes <code>MongoTemplate<\/code> bean, we can easily inject <code>MongoTemplate<\/code> into other config bean, like <code>CounterService<\/code>:<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<pre class=\" brush:java\">@Configuration\r\nclass MainAppConfig {\r\n...\r\n    @Bean\r\n    public CounterService counterService(MongoTemplate mongoTemplate) {\r\n        return new CounterServiceImpl(mongoTemplate);\r\n    }\r\n...\r\n}<\/pre>\n<p>Before you start running your app in any environment, you have to set up a <code>Counter<\/code> document first. Just type the following script in MongoDB shell:<\/p>\n<pre class=\" brush:java\">db.Counter.insert({ 'name' : 'user_id', sequence : 1})<\/pre>\n<p>OK, those are the steps to prepare a user id sequence generator. But how can we use it when we want to add a new user to our system? It becomes very easy now. We will have an <code>AccountService<\/code>, which has <code>createUserAccount<\/code> method, to create a new <code>UserAccount<\/code> when the user sign in for the first time.<\/p>\n<pre class=\" brush:java\">public interface AccountService extends SocialUserDetailsService, UserDetailsService, UserIdExtractor {\r\n    UserAccount findByUserId(String userId);\r\n\r\n    List&lt;UserAccount&gt; getAllUsers();\r\n\r\n    List&lt;UserSocialConnection&gt; getConnectionsByUserId(String userId);\r\n\r\n    UserAccount createUserAccount(ConnectionData data);\r\n}<\/pre>\n<p>In our implementation class <code>AccountServiceImpl<\/code>, we can use <code>CounterService<\/code>, see highlighted code below:<\/p>\n<pre class=\" brush:java\">public class AccountServiceImpl implements AccountService {\r\n    private final UserAccountRepository accountRepository;\r\n    private final UserSocialConnectionRepository userSocialConnectionRepository;\r\n    private final CounterService counterService;\r\n\r\n    @Inject\r\n    public AccountServiceImpl(UserAccountRepository accountRepository, UserSocialConnectionRepository userSocialConnectionRepository, CounterService counterService) {\r\n        this.accountRepository = accountRepository;\r\n        this.userSocialConnectionRepository = userSocialConnectionRepository;\r\n        this.counterService = counterService;\r\n    }\r\n\r\n    @Override\r\n    public UserAccount findByUserId(String userId) {\r\n        return accountRepository.findByUserId(userId);\r\n    }\r\n\r\n    @Override\r\n    public List&lt;UserAccount&gt; getAllUsers() {\r\n        return accountRepository.findAll();\r\n    }\r\n\r\n    @Override\r\n    public List&lt;UserSocialConnection&gt; getConnectionsByUserId(String userId){\r\n        return this.userSocialConnectionRepository.findByUserId(userId);\r\n    }\r\n\r\n    @Override\r\n    public UserAccount createUserAccount(ConnectionData data) {\r\n        UserAccount account = new UserAccount();\r\n        account.setUserId('user' + this.counterService.getNextUserIdSequence());\r\n        account.setDisplayName(data.getDisplayName());\r\n        account.setImageUrl(data.getImageUrl());\r\n        account.setRoles(new UserRoleType[] { UserRoleType.ROLE_USER });\r\n        this.accountRepository.save(account);\r\n        return account;\r\n    }\r\n\r\n    @Override\r\n    public SocialUserDetails loadUserByUserId(String userId) throws UsernameNotFoundException, DataAccessException {\r\n        UserAccount account = findByUserId(userId);\r\n        if (account == null) {\r\n            throw new UsernameNotFoundException('Cannot find user by userId ' + userId);\r\n        }\r\n        return account;\r\n    }\r\n\r\n    @Override\r\n    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {\r\n        return loadUserByUserId(username);\r\n    }\r\n\r\n    @Override\r\n    public String extractUserId(Authentication authentication) {\r\n        if (authentication instanceof SocialAuthenticationToken) {\r\n            SocialAuthenticationToken token = (SocialAuthenticationToken) authentication;\r\n            if (token.getPrincipal() instanceof SocialUserDetails) {\r\n                return ((SocialUserDetails) token.getPrincipal()).getUserId();\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n\r\n}<\/pre>\n<p>The Java config code to glue them together for AccountService:<\/p>\n<pre class=\" brush:java\">@Configuration\r\nclass MainAppConfig {\r\n...\r\n    @Bean\r\n    public AccountService accountService(MongoTemplate mongoTemplate, UserAccountRepository accountRepository,\r\n            UserSocialConnectionRepository userSocialConnectionRepository) {\r\n        AccountServiceImpl service = new AccountServiceImpl(accountRepository, userSocialConnectionRepository,\r\n                counterService(mongoTemplate));\r\n        return service;\r\n    }\r\n...\r\n}<\/pre>\n<p>When do we call <code>AccountService.createUserAccount()<\/code>? At the time when a first time user tries to sign in, and the system cannot find an existing <code>UserAccount<\/code>, so the <code>ConnectionSignUp<\/code> bean plugged into <code>MongoUsersConnectionRepository<\/code> will be called. (See my <a href=\"http:\/\/www.jiwhiz.com\/post\/2013\/1\/Customize_Spring_Social_Connect_Framework_For_MongoDB\">previous post<\/a> for other spring social connection related code.) So <code>ConnectionSignUp<\/code> will pass <code>ConnectionData<\/code> to <code>AccountService.createUserAccount()<\/code>:<\/p>\n<pre class=\" brush:java\">public class AutoConnectionSignUp implements ConnectionSignUp{\r\n    private final AccountService accountService;\r\n\r\n    @Inject\r\n    public AutoConnectionSignUp(AccountService accountService){\r\n        this.accountService = accountService;\r\n    }\r\n\r\n    public String execute(Connection&lt;?&gt; connection) {\r\n        ConnectionData data = connection.createData();\r\n\r\n        UserAccount account = this.accountService.createUserAccount(data);\r\n\r\n        return account.getUserId();\r\n    }\r\n}<\/pre>\n<p>My experience with <a href=\"http:\/\/www.springsource.org\/spring-data\/mongodb\">Spring Data MongoDB<\/a> is very positive. It is very powerful in providing basic CRUD functions as well as abundant query functions, and you don&#8217;t need to write any implementation code. If you have to use a special command of MongoDB, <code>MongoTemplate<\/code> is flexible enough to meet your requirements.<br \/>\n&nbsp;<\/p>\n<p><b><i>Reference: <\/i><\/b><a href=\"http:\/\/www.jiwhiz.com\/post\/2013\/1\/Add_A_Counter_To_MongoDB_With_Spring_Data\">MongoDB: Add A CounterWithSpring Data<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/p\/jcg.html\">JCG partner<\/a> Yuan Ji at the <a href=\"http:\/\/www.jiwhiz.com\/\">Jiwhiz<\/a> blog.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In my blog app, you can view any user&#8217;s profile, for example, my profile page will be http:\/\/www.jiwhiz.com\/profile\/user1, and &#8216;user1&#8217; is my user Id in the system. In MongoDB, every document object will have a unique identifier, and often we store it as String, so I have a BaseEntity class for that: &nbsp; &nbsp; &nbsp; &hellip;<\/p>\n","protected":false},"author":364,"featured_media":187,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[112,30,321],"class_list":["post-9559","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-mongodb","tag-spring","tag-spring-data"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>MongoDB: Add A CounterWithSpring Data<\/title>\n<meta name=\"description\" content=\"In my blog app, you can view any user&#039;s profile, for example, my profile page will be http:\/\/www.jiwhiz.com\/profile\/user1, and &#039;user1&#039; is my user Id in\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MongoDB: Add A CounterWithSpring Data\" \/>\n<meta property=\"og:description\" content=\"In my blog app, you can view any user&#039;s profile, for example, my profile page will be http:\/\/www.jiwhiz.com\/profile\/user1, and &#039;user1&#039; is my user Id in\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2013-03-08T20:00:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-03-08T23:44:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/mongodb-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Yuan Ji\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/jiwhiz\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Yuan Ji\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/mongodb-add-a-counter-with-spring-data.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/mongodb-add-a-counter-with-spring-data.html\"},\"author\":{\"name\":\"Yuan Ji\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/ab7cf96563ce3fe234bd3912c2580820\"},\"headline\":\"MongoDB: Add A Counter With Spring Data\",\"datePublished\":\"2013-03-08T20:00:46+00:00\",\"dateModified\":\"2013-03-08T23:44:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/mongodb-add-a-counter-with-spring-data.html\"},\"wordCount\":530,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/mongodb-add-a-counter-with-spring-data.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/mongodb-logo.jpg\",\"keywords\":[\"MongoDB\",\"Spring\",\"Spring Data\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/mongodb-add-a-counter-with-spring-data.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/mongodb-add-a-counter-with-spring-data.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/mongodb-add-a-counter-with-spring-data.html\",\"name\":\"MongoDB: Add A CounterWithSpring Data\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/mongodb-add-a-counter-with-spring-data.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/mongodb-add-a-counter-with-spring-data.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/mongodb-logo.jpg\",\"datePublished\":\"2013-03-08T20:00:46+00:00\",\"dateModified\":\"2013-03-08T23:44:11+00:00\",\"description\":\"In my blog app, you can view any user's profile, for example, my profile page will be http:\\\/\\\/www.jiwhiz.com\\\/profile\\\/user1, and 'user1' is my user Id in\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/mongodb-add-a-counter-with-spring-data.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/mongodb-add-a-counter-with-spring-data.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/mongodb-add-a-counter-with-spring-data.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/mongodb-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/mongodb-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/mongodb-add-a-counter-with-spring-data.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"MongoDB: Add A Counter With Spring Data\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/ab7cf96563ce3fe234bd3912c2580820\",\"name\":\"Yuan Ji\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/75e5ae238a8868d317d02621afc36017d01bfd867c5704dc7a64dcce40a240b6?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/75e5ae238a8868d317d02621afc36017d01bfd867c5704dc7a64dcce40a240b6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/75e5ae238a8868d317d02621afc36017d01bfd867c5704dc7a64dcce40a240b6?s=96&d=mm&r=g\",\"caption\":\"Yuan Ji\"},\"description\":\"Yuan is a passionate Java programmer and open source evangelist. He is eager to learn new technologies and loves clean and beautiful application design. He lives in Edmonton, Canada as an independent consultant and contractor.\",\"sameAs\":[\"http:\\\/\\\/www.jiwhiz.com\\\/\",\"http:\\\/\\\/www.linkedin.com\\\/in\\\/jiwhiz\",\"https:\\\/\\\/x.com\\\/https:\\\/\\\/twitter.com\\\/jiwhiz\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/yuan-ji\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"MongoDB: Add A CounterWithSpring Data","description":"In my blog app, you can view any user's profile, for example, my profile page will be http:\/\/www.jiwhiz.com\/profile\/user1, and 'user1' is my user Id in","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html","og_locale":"en_US","og_type":"article","og_title":"MongoDB: Add A CounterWithSpring Data","og_description":"In my blog app, you can view any user's profile, for example, my profile page will be http:\/\/www.jiwhiz.com\/profile\/user1, and 'user1' is my user Id in","og_url":"https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2013-03-08T20:00:46+00:00","article_modified_time":"2013-03-08T23:44:11+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/mongodb-logo.jpg","type":"image\/jpeg"}],"author":"Yuan Ji","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/jiwhiz","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Yuan Ji","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html"},"author":{"name":"Yuan Ji","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/ab7cf96563ce3fe234bd3912c2580820"},"headline":"MongoDB: Add A Counter With Spring Data","datePublished":"2013-03-08T20:00:46+00:00","dateModified":"2013-03-08T23:44:11+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html"},"wordCount":530,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/mongodb-logo.jpg","keywords":["MongoDB","Spring","Spring Data"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html","url":"https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html","name":"MongoDB: Add A CounterWithSpring Data","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/mongodb-logo.jpg","datePublished":"2013-03-08T20:00:46+00:00","dateModified":"2013-03-08T23:44:11+00:00","description":"In my blog app, you can view any user's profile, for example, my profile page will be http:\/\/www.jiwhiz.com\/profile\/user1, and 'user1' is my user Id in","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/mongodb-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/mongodb-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/mongodb-add-a-counter-with-spring-data.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"MongoDB: Add A Counter With Spring Data"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/ab7cf96563ce3fe234bd3912c2580820","name":"Yuan Ji","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/75e5ae238a8868d317d02621afc36017d01bfd867c5704dc7a64dcce40a240b6?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/75e5ae238a8868d317d02621afc36017d01bfd867c5704dc7a64dcce40a240b6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/75e5ae238a8868d317d02621afc36017d01bfd867c5704dc7a64dcce40a240b6?s=96&d=mm&r=g","caption":"Yuan Ji"},"description":"Yuan is a passionate Java programmer and open source evangelist. He is eager to learn new technologies and loves clean and beautiful application design. He lives in Edmonton, Canada as an independent consultant and contractor.","sameAs":["http:\/\/www.jiwhiz.com\/","http:\/\/www.linkedin.com\/in\/jiwhiz","https:\/\/x.com\/https:\/\/twitter.com\/jiwhiz"],"url":"https:\/\/www.javacodegeeks.com\/author\/yuan-ji"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/9559","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/364"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=9559"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/9559\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/187"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=9559"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=9559"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=9559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}