我在 MongoDB 数据库中有一个用户集合。每个文档都有一个 ObjectId 类型的 _id。我希望能够将它们映射到 POJO,该 POJO 在我的应用程序中具有 String 类型的 id。
目前,我的应用程序中的 User POJO 有一个像这样的 ObjectId。
@BsonId
private ObjectId id;
MongoDB 文档中的“POJO 定制”页面表示我应该能够执行以下操作:
@BsonId
@BsonRepresentation(BsonType.OBJECT_ID)
private String id;
但是仍然会出现以下错误:
Failed to decode 'User'. Decoding '_id' errored with: readString can only be called when CurrentBSONType is STRING, not when CurrentBSONType is OBJECT_ID.
这是用于从数据库检索用户的代码。
@PostConstruct
public void init() {
MongoClient mongo = mongoClientProvider.getMongoClient();
MongoDatabase db = mongo.getDatabase("ct6049DB");
collection = db.getCollection("users", User.class);
}
// Get a user by their email
public User getUserByEmail(String email) {
return collection.find(eq("email", email)).first();
}
我的 MongoClient 上使用的 CodecRegistry 是:
CodecRegistry myRegistry = fromRegistries(
MongoClientSettings.getDefaultCodecRegistry(),
fromProviders(PojoCodecProvider.builder().automatic(true).build())
);
但我也尝试添加
Conventions.ANNOTATION_CONVENTION
到此。
我应该指定将 POJO 上的 id 更改为 ObjectId 而不是 String(如此处答案中所指定:readString 仅当 CurrentBSONType 为 STRING 时才能调用,而不是当 CurrentBSONType 为 OBJECT_ID 时调用)不是一个选项。链接问题的其他答案建议删除我的集合中具有 id 的 ObjectId (也不是一个选项)的所有文档,添加 @BsonId (我已经有了),并添加 @BsonProperty("id") (这不解决了这个问题,添加 @BsonProperty("_id")) 也没有解决。
这是一个演示 SQL 和 NoSQL 数据库之间差异的项目,因此 POJO 与数据库无关(id 的字符串),同时在数据库中维护 MongoDB 的首选 id 类型会很好。
我正在提供 Java 的代码结构。
@Data
@Document("users")
public class User {
@Id
String id;
@SearchField
String firstName;
}
然后,
public interface UserRepository extends MongoRepository<User,String> {
}
这个存储库可以帮助您从 mongo 获取数据。
然后,
这是服务代码
User find();
然后,
是服务实现,实现服务类并用
@Service
注解进行注释。
@Autowired
用户存储库用户存储库;
public User find() {
return userRepository.findAll();
}
然后在最后一个控制器部分之后,
@RestController
@RequestMapping("/users")
public class UserController{
@Autowired
UserService userService;
@RequestMapping(name="getUser", value="/getUser", method=RequestMethod.GET)
public Response<User> getUserById(){
return Response.ok().setData(userService.find()).setMessage("YOUR_RESPONSE_MESSAGE");
}
}
我的回应课,
@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Response<T> {
private Status status;
private T data;
private String message;
}
整个流程是从控制器(里面的响应)>服务>服务实现>repo>模型(pojo)开始。
希望你理解。