Det forekommer mig, at problemet kan beskrives sådan her:hvis du bruger String i dine klasser i stedet for et ObjectId, hvis du vil bruge disse id'er som referencer (ingen dbrefs) i andre dokumenter (og indlejrede dokumenter), bliver de skubbet som streng (det er ok, fordi de er strenge). Det er fint, fordi forårsdata kan kortlægge dem igen til objectid, men det er ikke fint, hvis du laver en forespørgsel som den, jeg nævnte; feltet konverteres til et objektid i sammenligningen ($ne operatoren i dette tilfælde), men betragtes som en streng i det indlejrede dokument. Så for at afslutte, efter min mening bør $ne-operatoren i dette tilfælde betragte feltet som en streng.
Min løsning var at skrive en brugerdefineret konverter til at gemme strengen som et objekt-id i de dokumenter, hvor id'et er en reference
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;
}
}