Струва ми се, че проблемът може да се опише по следния начин:ако използвате String във вашите класове вместо ObjectId, ако искате да използвате тези идентификатори като препратки (без dbrefs) в други документи (и вградени документи), те се натискат като низ (добре е, защото те са низове). Добре е, защото данните от пролетта могат да ги картографират отново към objectid, но не е добре, ако направите заявка като тази, която споменах; полето се преобразува в objectid при сравнението (операторът $ne в този случай), но се счита за низ във вградения документ. И така, за да приключим, според мен операторът $ne в този случай трябва да счита полето за низ.
Моето решение беше да напиша персонализиран конвертор за съхраняване на низа като objectid в документите, където идентификаторът е препратка
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;
}
}