雪傾城 發表於 2020-1-10 18:11:00

MongoTemplate 操作 mongodb

<p>1. 增加依赖</p>
<div class="cnblogs_code">
<pre>      &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-starter-data-mongodb&lt;/artifactId&gt;
            &lt;version&gt;1.5.2.RELEASE&lt;/version&gt;
      &lt;/dependency&gt;</pre>
</div>
<p>2.增加配置</p>
<div class="cnblogs_code">
<pre>spring.data.mongodb.database=<span style="color: rgba(0, 0, 0, 1)">test
spring.data.mongodb.uri</span>=mongodb:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">user:password@192.168.1.2:27017/admin</span></pre>
</div>
<p>&nbsp;3.Operator类</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.google.common.collect.ImmutableMap;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.g2.order.server.business.vo.common.PagedResult;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.mongodb.WriteResult;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.bson.types.ObjectId;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.beans.factory.annotation.Autowired;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.annotation.Id;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.FindAndModifyOptions;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.MongoTemplate;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.mapping.Document;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.query.Criteria;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.query.Update;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.stereotype.Component;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.util.Assert;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.util.CollectionUtils;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.query.Query;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.domain.Sort;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.List;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.Map;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> lombok.Data;

</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
* 操作类.
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> MongoDbOperator&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> MongoTemplate mongoTemplate;

    </span><span style="color: rgba(0, 0, 255, 1)">private</span> Class&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> tClass;

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> MongoDbOperator(MongoTemplate mongoTemplate, Class&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> classz) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.mongoTemplate =<span style="color: rgba(0, 0, 0, 1)"> mongoTemplate;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.tClass =<span style="color: rgba(0, 0, 0, 1)"> classz;
    }


    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> T getOne(ObjectId id) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mongoTemplate.findById(id, tClass);
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> T getOne(String id) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> getOne(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ObjectId(id));
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> T getOne(Map&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)"> filter) {
      Assert.notNull(filter, </span>"过滤条件不能为空"<span style="color: rgba(0, 0, 0, 1)">);
      Query queryFilter </span>=<span style="color: rgba(0, 0, 0, 1)"> getQueryFilter(filter);

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mongoTemplate.findOne(queryFilter, tClass);
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 获取单个model
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> filter 过滤条件
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> sort   Sort theSort = new Sort(Sort.Direction.ASC, "_id");
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> T getOne(Map&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)"> filter, Sort sort) {
      Query queryFilter </span>=<span style="color: rgba(0, 0, 0, 1)"> getQueryFilter(filter);
      queryFilter </span>=<span style="color: rgba(0, 0, 0, 1)"> queryFilter.with(sort);

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mongoTemplate.findOne(queryFilter, tClass);
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 按访问时间倒序排列
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> filter 过滤条件
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> sort   排序条件
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> limit前几个(0:不限制)
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> List&lt;T&gt; list(Map&lt;String, Object&gt; filter, Sort sort, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> limit) {
      Query queryFilter </span>=<span style="color: rgba(0, 0, 0, 1)"> getQueryFilter(filter);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (sort != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
            queryFilter </span>=<span style="color: rgba(0, 0, 0, 1)"> queryFilter.with(sort);
      }
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (limit &gt; 0<span style="color: rgba(0, 0, 0, 1)">) {
            queryFilter </span>=<span style="color: rgba(0, 0, 0, 1)"> queryFilter.limit(limit);
      }

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mongoTemplate.find(queryFilter, tClass);
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 按访问时间倒序排列
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> filter 过滤条件
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">long</span> count(Map&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)"> filter) {
      Query queryFilter </span>=<span style="color: rgba(0, 0, 0, 1)"> getQueryFilter(filter);

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mongoTemplate.count(queryFilter, tClass);
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 分页查询
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> filter    过滤条件
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> sort      排序条件
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> pageIndex 第几页
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> pageSize每页大小
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> PagedResult&lt;T&gt; pagedList(Map&lt;String, Object&gt; filter, Sort sort, <span style="color: rgba(0, 0, 255, 1)">int</span> pageIndex, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> pageSize) {
      Query queryFilter </span>=<span style="color: rgba(0, 0, 0, 1)"> getQueryFilter(filter);
      </span><span style="color: rgba(0, 0, 255, 1)">long</span> count =<span style="color: rgba(0, 0, 0, 1)"> count(queryFilter);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (sort != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
            queryFilter </span>=<span style="color: rgba(0, 0, 0, 1)"> queryFilter.with(sort);
      }
      queryFilter </span>= queryFilter.skip((pageIndex - 1) *<span style="color: rgba(0, 0, 0, 1)"> pageSize).limit(pageSize);
      List</span>&lt;T&gt; subItems =<span style="color: rgba(0, 0, 0, 1)"> mongoTemplate.find(queryFilter, tClass);

      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span> PagedResult&lt;&gt;(subItems, pageIndex, pageSize, (<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)">) count);
    }


    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 按访问时间倒序排列
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> filter 过滤条件
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> List&lt;T&gt; list(Map&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)"> filter) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> list(filter, <span style="color: rgba(0, 0, 255, 1)">null</span>, 0<span style="color: rgba(0, 0, 0, 1)">);
    }


    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 插入新数据
   * 返回的id在obj中赋值
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> insert(T obj) {
      mongoTemplate.insert(obj);
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> updateOne(String id, Map&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)"> filedValues) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> updateOne(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ObjectId(id), filedValues);
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> updateOne(ObjectId id, Map&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)"> filedValues) {
      Query queryFilter </span>=<span style="color: rgba(0, 0, 0, 1)"> getQueryFilter(id);

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> updateImpl(queryFilter, filedValues);
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> update(Map&lt;String, Object&gt; filter, Map&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)"> filedValues) {
      Query queryFilter </span>=<span style="color: rgba(0, 0, 0, 1)"> getQueryFilter(filter);

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> updateImpl(queryFilter, filedValues);
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span> exists(Map&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)"> filter) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> getOne(filter) != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 删除
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> id _id
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> delete(String id) {
      Query queryFilter </span>= getQueryFilter(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ObjectId(id));

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> delete(queryFilter);
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 删除
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> id _id
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> delete(ObjectId id) {
      Query queryFilter </span>=<span style="color: rgba(0, 0, 0, 1)"> getQueryFilter(id);

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> delete(queryFilter);
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 删除
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> filter 用户Id
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> delete(Map&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)"> filter) {
      Query queryFilter </span>=<span style="color: rgba(0, 0, 0, 1)"> getQueryFilter(filter);

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> delete(queryFilter);
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 软删除
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> filter 用户Id
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> softDelete(Map&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)"> filter) {
      Query queryFilter </span>=<span style="color: rgba(0, 0, 0, 1)"> getQueryFilter(filter);
      WriteResult result </span>= mongoTemplate.updateMulti(queryFilter, Update.update("isDel", 1<span style="color: rgba(0, 0, 0, 1)">), tClass);

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result.getN();
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 根据当前表名获取自增id
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> collectionName 表名
   * </span><span style="color: rgba(128, 128, 128, 1)">@return</span><span style="color: rgba(0, 128, 0, 1)"> 自增id
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> getNextSequence() {
      String collectionName </span>=<span style="color: rgba(0, 0, 0, 1)"> mongoTemplate.getCollectionName(tClass);
      Query query </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> Query(Criteria.where("_id"<span style="color: rgba(0, 0, 0, 1)">).is(collectionName));
      Update update </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Update();
      update.inc(</span>"seq", 1<span style="color: rgba(0, 0, 0, 1)">);

      FindAndModifyOptions options </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> FindAndModifyOptions();
      options.upsert(</span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
      options.returnNew(</span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);

      MongoSequence item </span>= mongoTemplate.findAndModify(query, update, options, MongoSequence.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> item.getSeq();
    }

    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> count(Query queryFilter) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mongoTemplate.count(queryFilter, tClass);
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 删除
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> queryFilter 用户Id
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> delete(Query queryFilter) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mongoTemplate.remove(queryFilter, tClass).getN();
    }

    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span> updateImpl(Query queryFilter, Map&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)"> filedValues) {
      Update updateOperations </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Update();
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> (Map.Entry&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)"> entry : filedValues.entrySet()) {
            updateOperations.set(entry.getKey(), entry.getValue());
      }
      WriteResult writeResult </span>=<span style="color: rgba(0, 0, 0, 1)"> mongoTemplate.updateMulti(queryFilter, updateOperations, tClass);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> writeResult.getN();
    }

    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Query getQueryFilter(ObjectId id) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> getQueryFilter(ImmutableMap.of("_id"<span style="color: rgba(0, 0, 0, 1)">, id));
    }

    </span><span style="color: rgba(0, 0, 255, 1)">private</span> Query getQueryFilter(Map&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)"> filter) {
      Query query </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Query();
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (CollectionUtils.isEmpty(filter)) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> query;
      }
      Criteria criteria </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Criteria();
      </span><span style="color: rgba(0, 0, 255, 1)">boolean</span> w = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> (Map.Entry&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)"> entry : filter.entrySet()) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">w) {
                criteria </span>=<span style="color: rgba(0, 0, 0, 1)"> (Criteria.where(entry.getKey()).is(entry.getValue()));
                w </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                criteria </span>=<span style="color: rgba(0, 0, 0, 1)"> criteria.and(entry.getKey()).is(entry.getValue());
            }
      }
      query.addCriteria(criteria);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> query;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">private</span> Update getUpdateOperations(Map&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)"> filedValues) {
      Update updateOperations </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Update();
      updateOperations.inc(</span>"version", 1<span style="color: rgba(0, 0, 0, 1)">);
      updateOperations.set(</span>"lastModifyTime"<span style="color: rgba(0, 0, 0, 1)">, System.currentTimeMillis());
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> (Map.Entry&lt;String, Object&gt;<span style="color: rgba(0, 0, 0, 1)"> entry : filedValues.entrySet()) {
            updateOperations.set(entry.getKey(), entry.getValue());
      }

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> updateOperations;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Update getSoftDeleteOperations() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> getUpdateOperations(ImmutableMap.of("deleted", <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">));
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 自增序列维护表
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
    @Data
    @Document(collection </span>= "___MongoSequence___"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> MongoSequence {
      </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
         * 表名做主键
         </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
      @Id
      </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String id;

      </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
         * 对应表的最新自增id
         </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
      <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> seq;
    }
}</span></pre>
</div>
<p>&nbsp;</p>
<p>4.mongodb不保存"_class"字段的配置</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.beans.factory.BeanFactory;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.beans.factory.NoSuchBeanDefinitionException;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.context.annotation.Bean;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.context.annotation.Configuration;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.MongoDbFactory;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.convert.CustomConversions;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.convert.DbRefResolver;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.convert.MappingMongoConverter;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.mapping.MongoMappingContext;

</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
* 覆盖原有的Convert,新的convert不保存_class字段
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@Configuration
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> SpringMongodbTemplateConfig {
    @Bean
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context,
            BeanFactory beanFactory) {
      DbRefResolver dbRefResolver </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DefaultDbRefResolver(factory);
      MappingMongoConverter mappingConverter </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MappingMongoConverter(dbRefResolver, context);
      </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
            mappingConverter.setCustomConversions(beanFactory.getBean(CustomConversions.</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">));
      } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (NoSuchBeanDefinitionException ignore) {
      }

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 不保存 _class 到 mongo</span>
      mappingConverter.setTypeMapper(<span style="color: rgba(0, 0, 255, 1)">new</span> DefaultMongoTypeMapper(<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">));

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mappingConverter;
    }
}</span></pre>
</div>
<p>&nbsp;</p>
<p>5.测试model类</p>
<div class="cnblogs_code">
<pre>@Document(collection = "login_log"<span style="color: rgba(0, 0, 0, 1)">)
@Data
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> LoginLog {
    @Id
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String id;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String customerId;
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> lastLoginTime;
}</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;6.接口</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.google.common.collect.ImmutableMap;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.g2.order.server.business.MongoDbOperator;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.g2.order.server.business.vo.LoginLog;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.beans.factory.annotation.Autowired;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.MongoTemplate;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.query.Criteria;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.query.Query;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.web.bind.annotation.RequestMapping;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.web.bind.annotation.RequestMethod;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.web.bind.annotation.RestController;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.List;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> javax.annotation.PostConstruct;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> io.swagger.annotations.Api;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> io.swagger.annotations.ApiOperation;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> lombok.extern.slf4j.Slf4j;


@Api(value </span>= "MongodbController", description = "登陆日志接口"<span style="color: rgba(0, 0, 0, 1)">)
@RestController
@RequestMapping(</span>"/loginLog"<span style="color: rgba(0, 0, 0, 1)">)
@Slf4j
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> MongodbController {
    @Autowired
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> MongoTemplate template;

    </span><span style="color: rgba(0, 0, 255, 1)">private</span> MongoDbOperator&lt;LoginLog&gt;<span style="color: rgba(0, 0, 0, 1)"> mongoDbOperator;

    @PostConstruct
    </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> init() {
      mongoDbOperator </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> MongoDbOperator&lt;&gt;(template, LoginLog.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 使用MongoTemplate查询数据
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
    @ApiOperation(value </span>= "获取用户的登陆日志", notes = "获取用户的登陆日志"<span style="color: rgba(0, 0, 0, 1)">)
    @RequestMapping(value </span>= "/list"<span style="color: rgba(0, 0, 0, 1)">,
            method </span>=<span style="color: rgba(0, 0, 0, 1)"> RequestMethod.GET)
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String list(String key) {
      Query query </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Query();
      query.addCriteria(Criteria.where(</span>"customerId"<span style="color: rgba(0, 0, 0, 1)">).is(Integer.parseInt(key)));
      List</span>&lt;LoginLog&gt; clientDevices = template.find(query, LoginLog.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> clientDevices.toString();
    }

    @ApiOperation(value </span>= "获取用户的登陆日志2", notes = "获取用户的登陆日志2"<span style="color: rgba(0, 0, 0, 1)">)
    @RequestMapping(value </span>= "/list2"<span style="color: rgba(0, 0, 0, 1)">,
            method </span>=<span style="color: rgba(0, 0, 0, 1)"> RequestMethod.GET)
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String list2(String key) {
      LoginLog model </span>= mongoDbOperator.getOne(ImmutableMap.of("customerId"<span style="color: rgba(0, 0, 0, 1)">, Integer.parseInt(key)));

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> model.toString();
    }

    @ApiOperation(value </span>= "新增用户登录日志", notes = "新增用户登录日志"<span style="color: rgba(0, 0, 0, 1)">)
    @RequestMapping(value </span>= "/add"<span style="color: rgba(0, 0, 0, 1)">,
            method </span>=<span style="color: rgba(0, 0, 0, 1)"> RequestMethod.GET)
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String add(String customerId) {
      LoginLog model </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> LoginLog();
      model.setId(mongoDbOperator.getNextSequence());
      model.setCustomerId(customerId);
      model.setLastLoginTime(System.currentTimeMillis());
      mongoDbOperator.insert(model);

      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> model.toString();
    }
}</span></pre>
</div><br><br>
来源:https://www.cnblogs.com/zhshlimi/p/12177538.html
頁: [1]
查看完整版本: MongoTemplate 操作 mongodb