2017-06-05 63 views
1

我有一个spring-boot应用程序,我正在尝试使用它运行下面的查询。如何在spring-boot中运行自定义mongodb查询

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); 
} 

你能告诉我在做什么错?

+0

你有没有考虑过使用mongo db-factory或mongo模板? –

回答

1

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

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

上述语句使用userActivityRepository.findAllDocuments为与标准获取记录然后使用开箱即用的MongoRepositorysave(Iterable<S> entites)方法来更新文件。

代替$inc已增加status字段。

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

希望这会有所帮助!