gpt4 book ai didi

java - Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

转载 作者:可可西里 更新时间:2023-11-01 09:47:35 26 4
gpt4 key购买 nike

我在数据库中有一个集合“documentDev”,分片键为“dNumber”示例文档:

{
"_id" : "12831221wadaee23",
"dNumber" : "115",
"processed": false
}

如果我尝试使用类似命令的任何查询工具更新此文档 -

db.documentDev.update({
"_id" : ObjectId("12831221wadaee23"),
"dNumber":"115"
},{
$set:{"processed": true}},
{ multi: false, upsert: false}
)}`

它正确地更新了文档。但是如果我确实使用 spring boot 的 mongorepository 命令,比如 DocumentRepo.save(对象)它抛出一个异常

  • Caused by: com.mongodb.MongoCommandException: Command failed with error 61: 'query in command must target a single shard key' on server by3prdddc01-docdb-3.documents.azure.com:10255. The full response is { "_t" : "OKMongoResponse", "ok" : 0, "code" : 61, "errmsg" : "query in command must target a single shard key", "$err" : "query in command must target a single shard key" }

这是我的文档对象:

@Document(collection = "documentDev")
public class DocumentDev
{
@Id
private String id;
private String dNumber;
private String fileName;
private boolean processed;
}

这是我的存储库类 -

@Repository
public interface DocumentRepo extends MongoRepository<DocumentDev,
String> { }

和我正在尝试更新的值

  • Value : doc : { "_id" : "12831221wadaee23", "dNumber" : "115", "processed": true }

我要执行的功能:

@Autowired
DocumentRepo docRepo;

docRepo.save(doc); // Fails to execute

注意:我在 dNumber 字段上启用了分片。而且我能够在 NoSQL 工具上使用 native 查询成功地进行更新。我还能够对非分片集合执行存储库保存操作。

更新:我可以通过使用 MongoTemplate 创建 native 查询来更新文档 - 我的查询如下所示 -

public DocumentDev updateProcessedFlag(DocumentDev request) {
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(request.getId()));
query.addCriteria(Criteria.where("dNumber").is(request.getDNumber()));
Update update = new Update();
update.set("processed", request.isProcessed());
mongoTemplate.updateFirst(query, update, request.getClass());
return request;
}

但这不是通用解决方案,因为任何其他字段都可能有更新,我的文档也可能有其他字段。

最佳答案

我有同样的问题,通过以下技巧解决了:

@Configuration
public class ReactiveMongoConfig {

@Bean
public ReactiveMongoTemplate reactiveMongoTemplate(ReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory,
MongoConverter converter, MyService service) {
return new ReactiveMongoTemplate(reactiveMongoDatabaseFactory, converter) {
@Override
protected Mono<UpdateResult> doUpdate(String collectionName, Query query, UpdateDefinition update,
Class<?> entityClass, boolean upsert, boolean multi) {
query.addCriteria(new Criteria("shardKey").is(service.getShardKey()));
return super.doUpdate(collectionName, query, update, entityClass, upsert, multi);
}
};
}
}

最好有一个注解@ShardKey 来将文档字段标记为分片并自动将其添加到查询中。

关于java - Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55169638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com