Mongodb-запрос данных Spring автоматически преобразует String в ObjectId

Название может быть не очень ясным, вот проблема.

m выполняет обновление в этой форме:

db.poi.update({
  _id: ObjectId("50f40cd052187a491707053b"),
  "votes.userid": {
    "$ne": "50f5460d5218fe9d1e2c7b4f"
  }
},
{
  $push: {
    votes: {
      "userid": "50f5460d5218fe9d1e2c7b4f", 
      "value": 1
    }
  },
  $inc: { "score":1 }
})

Вставить документ в массив, только если нетt с тем же идентификатором пользователя (обходной путь, потому что уникальные индексы неработать с массивами). Код отлично работает с консоли Монго. Из моего заявления яЯ использую это:

@Override
public void vote(String id, Vote vote) {
    Query query = new Query(Criteria.where("_id").is(id).and("votes.userid").ne(vote.getUserid()));
    Update update = new Update().inc("score", vote.getValue()).push("votes", vote);
    mongoOperations.updateFirst(query, update, Poi.class);
}

Это нормально работает, если как "Идентификатор пользователя" Я использую строку, которая можетЭто не будет ObjectId монго, но если я использую строку в примере, выполненный запрос преобразуется следующим образом (из mongosniff):

update  flags:0 q:{ _id: ObjectId('50f40cd052187a491707053b'), votes.userid: { $ne: ObjectId('50f5460d5218fe9d1e2c7b4f') } } o:{ $inc: { score: 1 }, $push: { votes: { userid: "50f5460d5218fe9d1e2c7b4f", value: 1 } } }

Строка теперь является Objectid. Это ошибка? BasicQuery делает то же самое. Единственное другое решение, которое я вижу, - это использовать ObjectId вместо String для всех идентификаторов классов.

Какие-нибудь мысли?

ОБНОВИТЬ:

Это класс голосования

public class Vote {
  private String userid;
  private int value;
}

Это класс пользователя

@Document
public class User {

  @Id
  private String id;
  private String username;
}

Это документ класса и монго, где яя делаю это обновление

@Document
public class MyClass {

  @Id
  private String id;
  @Indexed
  private String name;
  int score
  private Setvotes = new HashSet();
}

Как джсон

{
  "_id" : ObjectId("50f40cd052187a491707053b"),
  "name" : "Test",
  "score" : 12,
  "votes" : [
    {
      "userid" : "50f5460d5218fe9d1e2c7b4f",
      "value" : 1
    }
  ]
}

Идентификатор userid в voices.userid передается как String, но эта же String сравнивается с ObjectId в $ ne

Ответы на вопрос(1)

Ваш ответ на вопрос