【问题标题】:How to run a custom mongodb query in spring-boot如何在 spring-boot 中运行自定义 mongodb 查询
【发布时间】:2017-11-06 07:06:19
【问题描述】:

我有一个 spring-boot 应用程序,我正在尝试使用它运行下面的查询。

db.userActivity.findAndModify(
{ 
   query: { 'appId' : 1234, 'status' : 0},
   update: { $inc: { 'status': 1 } } 
});

我确实尝试过类似的方法但没有成功

public interface UserActivityRepository extends MongoRepository<UserActivity, String> {

    /**
     * Find all documents in the database
     * @param appId
     * @param status
     * @return
     */
    @Query("{ 'appId' : ?0, 'status' : ?1}")
    public List<UserActivity> findAllDocuments(long appId, int status);

    /**
     * Find all documents by appId whose state is unread
     * and marked them read after reading
     * @param appId
     * @return 
     */
    @Query("db.userActivity.findAndModify({ query: { 'appId' : ?0, 'status' : ?1}, update: { $inc: { 'status': 1 } } })")
    public List<UserActivity> findAndUpdateAllUnreadDocuments(long appId, int status);
}

你能告诉我我做错了什么吗?

【问题讨论】:

  • 你考虑过使用 mongo db-factory 还是 mongo 模板?

标签: java spring mongodb spring-boot spring-mongo


【解决方案1】:

MongoRepository 的类型是 。我假设 String 应该是你的 ID,我只看到 long 和 int 在你的自定义查询中作为参数传递。

来自文档

@NoRepositoryBean
public interface ReactiveMongoRepository<T, ID> extends ReactiveSortingRepository<T, ID>, ReactiveQueryByExampleExecutor<T>
  • @see CrudRepository
  • @param 存储库管理的域类型
  • @param 存储库管理的实体 id 的类型

【讨论】:

    【解决方案2】:

    @Query 注解仅用于自定义查询。使用findAllDocuments 函数并实现你的更新逻辑。这是完整的例子:Spring Boot + Spring Data MongoDB example

    【讨论】:

      【解决方案3】:

      好吧,我应该承认我找不到使用自定义 mongo 查询来更新文档的方法。但是,找到了一种使用 java8 流的方法。

       userActivityRepository.save(userActivityRepository.findAllDocuments(1234, 0)
      .stream()
      .peek((user) -> user.setStatus(user.getStatus() + 1))
      .collect(Collectors.toList()));
      

      上面的语句使用userActivityRepository.findAllDocuments获取带有条件的记录,然后使用OOTBMongoRepositorysave(Iterable&lt;S&gt; entites)方法更新文档。

      代替$inc 增加了status 字段。

      这可能不是您所期望的,但如果您希望实施,这只是一个可能的解决方案。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2019-07-07
        • 2021-08-16
        • 1970-01-01
        • 2019-01-12
        • 2019-07-28
        • 1970-01-01
        • 1970-01-01
        • 2018-04-26
        • 2016-03-22
        相关资源
        最近更新 更多