Đối với tôi, vấn đề có thể được mô tả như thế này:nếu bạn sử dụng Chuỗi trong các lớp của mình thay cho ObjectId, nếu bạn muốn sử dụng các id đó làm tài liệu tham khảo (không có dbrefs) trong các tài liệu khác (và tài liệu nhúng), chúng sẽ được đẩy dưới dạng Chuỗi (không sao vì chúng là Chuỗi). Không sao cả vì dữ liệu mùa xuân có thể ánh xạ lại chúng thành objectid, nhưng sẽ không ổn nếu bạn thực hiện một truy vấn như tôi đã đề cập; trường được chuyển đổi thành đối tượng trong so sánh (toán tử $ ne trong trường hợp này) nhưng được coi là một chuỗi trong tài liệu nhúng. Vì vậy, để kết thúc, theo ý kiến của tôi, toán tử $ ne trong trường hợp này nên coi trường là một Chuỗi.
Giải pháp của tôi là viết một trình chuyển đổi tùy chỉnh để lưu trữ Chuỗi dưới dạng đối tượng trong các tài liệu có id là tham chiếu
public class VoteWriteConverter implements Converter<Vote, DBObject> {
@Override
public DBObject convert(Vote vote) {
DBObject dbo = new BasicDBObject();
dbo.put("userid", new ObjectId(vote.getUserid()));
dbo.put("value", vote.getValue());
return dbo;
}
}