我有一个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);
}
你能告诉我我做错了吗?
答案 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 类型是
来自文档
@NoRepositoryBean
public interface ReactiveMongoRepository<T, ID> extends ReactiveSortingRepository<T, ID>, ReactiveQueryByExampleExecutor<T>