Printemps de données mongodb requête convertit une Chaîne en ObjectId automatiquement

Le titre est peut-être pas super clair, ici, le problème

Je suis de l'exécution d'une mise à jour sous cette forme:

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

Pour insérer un document dans un tableau seulement s'il n'y a pas un avec le même nom d'utilisateur (solution de contournement car les index uniques ne fonctionnent pas sur les tableaux). Le code fonctionne très bien à partir de mongo de la console. À partir de mon application que je suis en utilisant ceci:

@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);
}

Cela fonctionne bien si "userid" j'utilise une Chaîne qui ne peut pas être un mongo ObjectId, mais si j'utilise la chaîne dans l'exemple, la requête exécutée traduit comme ceci (à partir de mongosniff):

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

La chaîne est maintenant un Objectid. Est-ce un bug? BasicQuery faire la même chose. La seule autre solution que je vois est d'utiliser ObjectId au lieu de String pour toutes les classes id.

Toutes les pensées?

Mise à JOUR:

C'est le Vote de classe

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

C'est l'Utilisateur de la classe

@Document
public class User {

  @Id
  private String id;
  private String username;
}

C'est la classe et de mongo document où je suis en train de faire cette mise à jour

@Document
public class MyClass {

  @Id
  private String id;
  @Indexed
  private String name;
  int score
  private Set<Vote>votes = new HashSet<Vote>();
}

Json

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

Userid dans la voix.code d'utilisateur est encouragé à la Chaîne, mais la même Chaîne est comparé comme un ObjectId dans le $ne

Il semble que vous stockez String des valeurs qui peuvent être ObjectIds en interne. Quelle est la raison? Le String-à-ObjectId de conversion est présent afin d'être en mesure d'utiliser String dans vos objets Java et ont encore ObjectIds dans la base de données.
Peut-être que je suis absent quelque chose alors. Je suis à l'aide de Cordes comme _id pour les objets Utilisateur; mon Vote objets ont un nom d'utilisateur de la Chaîne de champ que j'utilise comme référence pour l'Utilisateur _id. La voix de "champ" dans la db est un des tableaux de documents. Quand j' $pousser un vote.userid dans ce tableau, j'ai une Chaîne de caractères dans la db, c'est pas un ObjectId. Je vais mettre à jour mon post avec un peu de code pour le rendre plus clair.
Vous ne dites pas quelle version vous utilisez, au Printemps, les données mongodb. J'ai récemment été mordu par l'inverse de cette mise à niveau à partir de la version 1.0.3 de la version 1.1.0, car ils semblent avoir enlevé cette conversion automatique. J'ai été mordu parce que j'avais exporté sous forme de JSON et puis réimporté, me laissant avec "_id" : { "$id" : "4ee76418f3e1450f11000000" }, ce qui me donne org.springframework.les données.la cartographie.de modèle.MappingException: mappage des métadonnées trouvé pour java.lang.Chaîne de caractères. Je ne pense pas que vous pouvez avoir les deux
C'était le Printemps de Données Mongodb 1.2.0
J'ai la même question. Si j'utilise la même chaîne dans le document de haut niveau, la comparaison des œuvres. Mais Si j'ai mis ceci dans l'objet imbriqué, alors il essaie de faire ObjectId comparaison. Très bizarre. Sinon aussi, le comportement doit être de même lors de l'insertion et d'interrogation. Doit être un BUG.

OriginalL'auteur alex | 2013-01-15