1
votes

MongoTemplate Update définit plusieurs objets dans un tableau pour le même document

J'ai un point de terminaison qui prend un ID de document et un objet Employee dans un tableau imbriqué que j'aimerais avoir mis à jour. Cela fonctionne bien. J'ai essayé de modifier le point de terminaison pour prendre plus d'un employé et les mettre à jour tous à la fois, mais je ne peux pas le faire fonctionner. Je ne sais pas si je me suis trompé de format ou si ce n'est pas possible.

Pour préciser, mon recensement est un objet déjà existant comme suit, avec 10 employés dans une liste:

Query query = new Query().addCriteria(new Criteria("id").is(id))
      .addCriteria(new Criteria("employeeList.employeeId").is(employee.getEmployeeId());
update.set("employeeList.$", employee);

UpdateResult result = mongoTemplate.updateFirst(query, update, Census.class);

Je souhaite mettre à jour un employé existant avec de nouvelles informations. J'utilise donc l'ID de document mongo pour trouver le document, puis je trouve l'employé correct dans la liste par son ID d'employé. Je l'ai fait fonctionner avec quelque chose comme ça pour une seule mise à jour d'employé:

{
  "id": <ID>
  ...
  "employeeList": [
  {
    "employeeId": <Employee_ID>,
    ...
  }
  ...
  ]
}

Quand j'ai essayé de le mettre à jour pour les faire tous en même temps, cela n'a pas fonctionné. Je me rends compte maintenant que mon approche n'a pas vraiment de sens, donc je ne la posterai pas (entourant essentiellement le .addCriteria et le update.set dans une boucle for pour le faire pour chaque employé dans la liste fournie). Vous avez une erreur comme: "En raison des limitations du com.mongodb.BasicDocument, vous ne pouvez pas ajouter un deuxième critère 'employeeList.employeeId'".

Puis-je le faire? La seule autre option consiste-t-elle simplement à mettre à jour ce document plusieurs fois de suite? Je pense que c'est mieux de le faire que d'appeler le point de terminaison X fois. Je suis sur Mongo 3.6 au cas où cela affecterait les réponses. TIA.


0 commentaires

3 Réponses :


0
votes

Désolé, mais votre message n'est pas clair. Vous affichez le champ de tableau EmployeeList - essayez-vous d'ajouter une valeur au tableau? d'un seul document ou de tous les documents?

si vous n'ajoutez pas de valeur à ce champ de tableau existant, cherchez-vous plutôt à ajouter un nouveau champ à tous les documents?


1 commentaires

Non, je pense que dans ce cas, j'utiliserais le update.push. J'essaie d'utiliser l'ensemble $ pour prendre un employé existant par son EmployeeID et le mettre à jour avec de nouvelles informations (par exemple: nom, etc.).



0
votes

voici un exemple de mise à jour du champ: poster pour le titre sélectionné:

db.movieDetails.updateOne(

{title: "The Martian"},
{$ set: {poster: " http: //ia.media-etc ."}} p >

Il y a aussi la mise à jourBeaucoup Vous devriez consulter le manuel en ligne de Mongo ....


2 commentaires

a eu des problèmes d'édition à ce sujet - il devrait s'agir d'un seul ensemble de code avec une fermeture)


Ce n'est pas du code Java utilisant MongoTemplate (ou un autre package inclus avec spring boot). Cela ne répond pas non plus à ma question sur la mise à jour de plusieurs objets de tableau en même temps avec l'opérateur $ set.



0
votes

Je n'ai trouvé aucune autre réponse à ma question. J'ai donc fini par le changer pour une approche de mise à jour en masse:

BulkOperations bulkOps = mongoTemplate.bulkOps(BulkMode.UNORDERED, Census.class);
for(Employee employee : employeeList) {
    Query query = new Query().addCriteria(new Criteria("id").is(id));
    Update update = new Update().set("employeeList.$", employee);
    bulkOps.updateOne(query, update);
}
BulkWriteResult results = bulkOps.execute();

Cela ne résout pas vraiment la question d'essayer de mettre à jour le même document plusieurs fois, mais cela fonctionne pour moi pour le moment.


0 commentaires