Zdá se mi, že problém lze popsat takto:pokud použijete String ve svých třídách místo ObjectId, pokud chcete tato ID použít jako reference (bez dbrefs) v jiných dokumentech (a vložených dokumentech), budou tlačena jako String (to je v pořádku, protože jsou to řetězce). Je to v pořádku, protože jarní data je mohou znovu mapovat na objectid, ale není to v pořádku, když uděláte dotaz, jako je ten, který jsem zmínil; pole je při porovnání převedeno na objectid (v tomto případě operátor $ne), ale ve vloženém dokumentu je považováno za řetězec. Abych to uzavřel, podle mého názoru by operátor $ne v tomto případě měl považovat pole za řetězec.
Mým řešením bylo napsat vlastní převaděč pro uložení String jako objectid v dokumentech, kde je id odkaz
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;
}
}