Bagi saya masalahnya dapat dijelaskan seperti ini:jika Anda menggunakan String di kelas Anda sebagai pengganti ObjectId, jika Anda ingin menggunakan id itu sebagai referensi (tanpa dbrefs) di dokumen lain (dan dokumen yang disematkan), mereka didorong sebagai String (tidak apa-apa karena mereka adalah String). Tidak apa-apa karena data pegas dapat memetakannya lagi ke objectid, tetapi tidak apa-apa jika Anda melakukan kueri seperti yang saya sebutkan; bidang dikonversi ke objectid dalam perbandingan (operator $ne dalam kasus ini) tetapi dianggap sebagai string dalam dokumen yang disematkan. Jadi, sebagai penutup, menurut saya operator $ne dalam hal ini harus mempertimbangkan bidang tersebut sebagai String.
Solusi saya adalah menulis konverter khusus untuk menyimpan String sebagai objectid dalam dokumen di mana id adalah referensi
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;
}
}