Parece-me que o problema pode ser descrito assim:se você usar String em suas classes no lugar de um ObjectId, se quiser usar esses ids como referências (sem dbrefs) em outros documentos (e documentos incorporados), eles são enviados como String (tudo bem porque são Strings). Tudo bem porque os dados de mola podem mapeá-los novamente para objectid, mas não é bom se você fizer uma consulta como a que mencionei; o campo é convertido em um objectid na comparação (o operador $ne neste caso), mas é considerado como uma string no documento incorporado. Então, para finalizar, na minha opinião o operador $ne neste caso deve considerar o campo uma String.
Minha solução foi escrever um conversor personalizado para armazenar a String como um objectid nos documentos onde o id é uma referência
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;
}
}