Wydaje mi się, że problem można opisać tak:jeśli używasz String w swoich klasach zamiast ObjectId, jeśli chcesz używać tych identyfikatorów jako referencji (bez dbrefs) w innych dokumentach (i dokumentach osadzonych), są one wypychane jako String (jest ok, bo są to Stringi). Jest w porządku, ponieważ dane wiosenne mogą ponownie mapować je do obiektu objectid, ale nie jest w porządku, jeśli wykonasz zapytanie takie jak to, o którym wspomniałem; pole jest konwertowane na obiekt w porównaniu (w tym przypadku operator $ne), ale jest traktowane jako ciąg znaków w osadzonym dokumencie. Podsumowując, moim zdaniem operator $ne w tym przypadku powinien traktować pole jako String.
Moim rozwiązaniem było napisanie niestandardowego konwertera do przechowywania ciągu jako obiektu w dokumentach, w których identyfikator jest referencją
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;
}
}