Het lijkt mij dat het probleem als volgt kan worden beschreven:als je String in je klassen gebruikt in plaats van een ObjectId, als je die id's als referenties (geen dbrefs) in andere documenten (en ingesloten documenten) wilt gebruiken, worden ze gepusht als String (het is oké omdat het Strings zijn). Het is prima omdat lentegegevens ze opnieuw kunnen toewijzen aan objectid, maar het is niet goed als je een query doet zoals die ik noemde; het veld wordt in de vergelijking geconverteerd naar een objectid (in dit geval de $ne-operator) maar wordt in het ingesloten document als een tekenreeks beschouwd. Dus, om af te ronden, naar mijn mening zou de $ne-operator in dit geval het veld als een String moeten beschouwen.
Mijn oplossing was om een aangepaste converter te schrijven om de string op te slaan als een object-id in de documenten waar de id een referentie is
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;
}
}