如何在spring-boot

时间:2017-06-05 13:28:53

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

我有一个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);
}

你能告诉我我做错了吗?

3 个答案:

答案 0 :(得分:1)

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

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

上述语句使用userActivityRepository.findAllDocuments来获取带有条件的记录,然后使用OOTB MongoRepository save(Iterable<S> entites)方法更新文档。

代替$inc增加了status字段。

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

希望这有帮助!

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

来自文档

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