弹簧靴&x2B;Mongodb手动参考不起作用,可以';我没有发现我的错误,查询Mongodb很好

弹簧靴&x2B;Mongodb手动参考不起作用,可以';我没有发现我的错误,查询Mongodb很好,mongodb,spring-boot,mongorepository,Mongodb,Spring Boot,Mongorepository,我是Spring boot和MongoDB的新手。在MongoDB中,两个集合之间的手动引用可以正常工作。Spring boot中的映射似乎不起作用。我真的不知道还需要检查什么。下面是所有相关的细节,很抱歉问了这么长的问题 不使用DBref的原因是我可能需要投影 “players”集合具有此架构(不允许任何其他架构) “games”集合具有以下架构 { "_id":{"$oid":"5f5614a361738cc35de7943b&

我是Spring boot和MongoDB的新手。在MongoDB中,两个集合之间的手动引用可以正常工作。Spring boot中的映射似乎不起作用。我真的不知道还需要检查什么。下面是所有相关的细节,很抱歉问了这么长的问题

不使用DBref的原因是我可能需要投影

“players”集合具有此架构(不允许任何其他架构)

“games”集合具有以下架构

   {
    "_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();
}