Mi sembra che il problema possa essere descritto in questo modo:se usi String nelle tue classi al posto di un ObjectId, se vuoi usare quegli ID come riferimenti (senza dbrefs) in altri documenti (e documenti incorporati), vengono spinti come String (va bene perché sono stringhe). Va bene perché i dati di primavera possono mapparli di nuovo su objectid, ma non va bene se si esegue una query come quella che ho menzionato; il campo viene convertito in un objectid nel confronto (l'operatore $ne in questo caso) ma viene considerato come una stringa nel documento incorporato. Quindi, per concludere, secondo me l'operatore $ne in questo caso dovrebbe considerare il campo una stringa.
La mia soluzione è stata scrivere un convertitore personalizzato per memorizzare la stringa come id oggetto nei documenti in cui l'id è un riferimento
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;
}
}