Il me semble que le problème peut être décrit comme ceci :si vous utilisez String dans vos classes à la place d'un ObjectId, si vous souhaitez utiliser ces identifiants comme références (pas de dbrefs) dans d'autres documents (et documents intégrés), ils sont poussés comme String (c'est ok parce que ce sont des Strings). C'est bien parce que les données de printemps peuvent les mapper à nouveau sur objectid, mais ce n'est pas bien si vous faites une requête comme celle que j'ai mentionnée; le champ est converti en objectid dans la comparaison (l'opérateur $ne dans ce cas) mais est considéré comme une chaîne dans le document intégré. Donc, pour conclure, à mon avis, l'opérateur $ne dans ce cas devrait considérer le champ comme une chaîne.
Ma solution était d'écrire un convertisseur personnalisé pour stocker la chaîne en tant qu'objectid dans les documents où l'id est une référence
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;
}
}