Det verkar för mig att problemet kan beskrivas så här:om du använder String i dina klasser istället för ett ObjectId, om du vill använda dessa id som referenser (inga dbrefs) i andra dokument (och inbäddade dokument), pushas de som sträng (det är ok eftersom de är strängar). Det är bra eftersom vårdata kan mappa dem igen till objectid, men det är inte bra om du gör en fråga som den jag nämnde; fältet konverteras till ett objekt-id i jämförelsen (operatorn $ne i detta fall) men betraktas som en sträng i det inbäddade dokumentet. Så, för att sammanfatta, enligt min åsikt bör $ne-operatorn i det här fallet betrakta fältet som en sträng.
Min lösning var att skriva en anpassad omvandlare för att lagra strängen som ett objekt-id i dokument där id är en referens
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;
}
}