弹簧靴&x2B;Mongodb手动参考不起作用,可以';我没有发现我的错误,查询Mongodb很好
我是Spring boot和MongoDB的新手。在MongoDB中,两个集合之间的手动引用可以正常工作。Spring boot中的映射似乎不起作用。我真的不知道还需要检查什么。下面是所有相关的细节,很抱歉问了这么长的问题 不使用DBref的原因是我可能需要投影 “players”集合具有此架构(不允许任何其他架构) “games”集合具有以下架构弹簧靴&x2B;Mongodb手动参考不起作用,可以';我没有发现我的错误,查询Mongodb很好,mongodb,spring-boot,mongorepository,Mongodb,Spring Boot,Mongorepository,我是Spring boot和MongoDB的新手。在MongoDB中,两个集合之间的手动引用可以正常工作。Spring boot中的映射似乎不起作用。我真的不知道还需要检查什么。下面是所有相关的细节,很抱歉问了这么长的问题 不使用DBref的原因是我可能需要投影 “players”集合具有此架构(不允许任何其他架构) “games”集合具有以下架构 { "_id":{"$oid":"5f5614a361738cc35de7943b&
{
"_id":{"$oid":"5f5614a361738cc35de7943b"},
"dices":{
"value1":1,
"value2":6
},
"gameScore":1,
"player_id":{"$oid":"5f56021d61738cc35de79438"}
}
MongoDB Compass中的聚合
[{
$match: {
_id: ObjectId('5f56021d61738cc35de79438')
}
}, {
$lookup: {
from: 'games',
localField: '_id',
foreignField: 'player_id',
as: 'games'
}
}]
屈服
在Spring boot中,POJO是:
@Document(collection = "players")
public class Player {
@Id
private String id;
private String name;
private LocalDate entryDate= LocalDate.now();
private List<Game> game;
public Player(){};
public Player(String name) {
this.name = name;
}
//getters and setters for all properties, including game
}
邮递员
获取findAll玩家表演:
[{“id”:“5f56021d61738cc35de79438”,“姓名”:“罗密欧”,“进入日期”:[2020,8,24],“游戏”:空},{“id”:“5F560E361738CC35DE79439”,“姓名”:“朱丽叶”,“进入日期”:[2020,8,24],“游戏”:空},
……]
之所以显示这个游戏,是因为我还为这个属性添加了getter和setter,只是想找到一种方法来正确地将游戏映射为对玩家的手动引用
获取findAll游戏:
[{“id”:“5f5614a361738cc35de7943b”,“骰子”:{“value1”:1,“value2”:6},“gameScore”:1,“玩家id”:“5F5621D61738CC35DE79438”}
{“id”:“5f5619f561738cc35de7943c”,“骰子”:{“value1”:2,“value2”:5},“gameScore”:1,“playerId”:“5F560E361738CC35DE79439”}
{“id”:“5f561a5461738cc35de7943d”,“骰子”:{“value1”:3,“value2”:3},“gameScore”:0,“playerId”:“5F5621D61738CC35DE79438”},
…]
获取lh:8080/玩家/5f56021d61738cc35de79438/游戏
产生一个空数组,这就是为什么我假设Spring boot中集合之间的映射失败
博弈论
@Repository
public interface GameRepository extends MongoRepository<Game, String> {
List<Game> findAll();
List<Game> findGamesByPlayerId(String playerId);
}
@存储库
公共界面GameRepository扩展了MongoRepository{
列出findAll();
列出findGamesByPlayerId(字符串播放器ID);
}
服务中的方法
@Override
public List<Game> findAllGamesByPlayerId(String playerId) {
Optional<Player> playerDB= playerRepository.findById(playerId);
if(playerDB.isPresent()) {
return gameRepository.findGamesByPlayerId(playerId);
}
else throw new ResourceNotFoundException("Player with id: "+playerId+" does not exist");
}
@覆盖
公共列表findAllGamesByPlayerId(字符串playerId){
可选playerDB=playerRepository.findById(playerId);
if(playerDB.isPresent()){
返回gameRepository.findGamesByPlayerId(playerId);
}
否则抛出新的ResourceNotFoundException(“id为“+playerId+”的玩家不存在”);
}
还有游戏控制器
@GetMapping("/{ID}/games")
public ResponseEntity<List<Game>> getAllGamesByPlayerId (@PathVariable("ID") String playerId){
return ResponseEntity.ok()
.body(gameService.findAllGamesByPlayerId(playerId));
}
@GetMapping(“/{ID}/games”)
public ResponseEntity getAllGamesByPlayerId(@PathVariable(“ID”)字符串playerId){
返回ResponseEntity.ok()
.body(gameService.findAllGamesByPlayerId(playerId));
}
欢迎给小费 聚合不适用于MongoRepostory,除非您使用。但不建议使用
@DBRef
。您在聚合中所做的可以转换为Spring数据的聚合管道。
为此,您需要自动连接MongoTemplate
@Autowired
MongoTemplate mongoTemplate;
然后,您可以转换已编写的聚合。我还没有测试它,因为您的聚合正在工作,所以应该可以工作
public List<Object> test(ObjectId id){
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("_id").is(id)),
lookup("games","_id","player_id","games")
).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE).build());
return mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(Players.class), Object.class).getMappedResults();
}
公共列表测试(ObjectId id){
Aggregation=Aggregation.newAggregation(
匹配(标准,其中(“_id”)是(id)),
查找(“游戏”、“玩家id”、“游戏”)
).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE.build());
返回mongoTemplate.aggregate(聚合,mongoTemplate.getCollectionName(Players.class),Object.class).getMappedResults();
}
对不起,我删除了以前的评论。如果理解正确,我必须在配置类中添加以下Bean:```public@Bean MongoClient MongoClient(){return MongoClients.create(connectionString);}public@Bean MongoTemplate MongoTemplate(){return new MongoTemplate((com.mongodb.MongoClient)MongoClient(),“dicsdb”);}``我不使用mongo客户端,因为mongoTemple包含它。你对mongodbThanks@varman有什么依赖!您是对的,这是我的错误,我试图在接口中自动连接MongoTemplate…:/厄普斯。我在这个问题中发现了更多的步骤:KekAMV如果这个答案对你有帮助,请考虑点击UpCopy并接受帮助寻找这种PRBLM的人的答案。
@GetMapping("/{ID}/games")
public ResponseEntity<List<Game>> getAllGamesByPlayerId (@PathVariable("ID") String playerId){
return ResponseEntity.ok()
.body(gameService.findAllGamesByPlayerId(playerId));
}
@Autowired
MongoTemplate mongoTemplate;
public List<Object> test(ObjectId id){
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("_id").is(id)),
lookup("games","_id","player_id","games")
).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE).build());
return mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(Players.class), Object.class).getMappedResults();
}