Es scheint mir, dass das Problem wie folgt beschrieben werden kann:Wenn Sie String in Ihren Klassen anstelle einer ObjectId verwenden und diese IDs als Referenzen (keine dbrefs) in anderen Dokumenten (und eingebetteten Dokumenten) verwenden möchten, werden sie verschoben als String (es ist ok, weil sie Strings sind). Es ist in Ordnung, weil spring data sie wieder auf objectid abbilden kann, aber es ist nicht in Ordnung, wenn Sie eine Abfrage wie die von mir erwähnte durchführen; Das Feld wird beim Vergleich in eine Objekt-ID umgewandelt (in diesem Fall der $ne-Operator), wird jedoch im eingebetteten Dokument als Zeichenfolge betrachtet. Also, um es zusammenzufassen, meiner Meinung nach sollte der $ne-Operator in diesem Fall das Feld als String betrachten.
Meine Lösung bestand darin, einen benutzerdefinierten Konverter zu schreiben, um den String als Objekt-ID in den Dokumenten zu speichern, in denen die ID eine Referenz ist
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;
}
}