2017-06-05 98 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字段。

這可能不是您所期望的,但如果您希望實施,這只是一個可能的解決方案。

希望這會有所幫助!