2016-06-08 2 views
3

J'ai actuellement des documents en MongoDB avec le format suivant:documents Mise à jour dans MongoDB

{ 
    "title": "name of the document", 
    "tags" : ["tag1", "tag2", "tag3"] 
} 

Je veux être en mesure de rechercher tous les documents qui ont « terme_recherche » dans leur champ de titre, puis ajouter « terme_recherche » dans le champ de leurs tags. Existe-t-il un moyen facile/propre de le faire sans ré-ingérer tous mes documents ou dois-je simplement écrire un script pour le faire avant de les réinsérer dans mongodb?

j'ai lu la documentation de MongoDB pour db.collection.update() qui avait des exemples comme:

db.people.update(
{ name: "Andy" }, 
{ 
    name: "Andy", 
    rating: 1, 
    score: 1 
}, 
{ upsert: true } 
) 

Mais cela ne m'a pas aidé car je ne veux pas remplacer complètement mes « tags » champ mais plutôt s'y ajouter.

+0

Quelque chose comme 'db.search.update ({title: /.*search_term.*/}, {push $: { "tags": "search_term"}}, {multi: true}) '. Mais comme il met à jour plusieurs documents, ce ne sera pas une mise à jour atomique. –

Répondre

3
db.people.update(
    { "title": "search_term" }, 
    { "$push": { "tags": "search_term" } }, 
    { "multi": true } 
); 

En général, je fais des migrations/changements sur tous les ensembles de données etc. dans un script et je l'exécute à partir d'un itinéraire d'administration.

Explication:

  • Première JSON: filtre recherche
  • Deuxième JSON: pousser au tableau
  • multi: true si vous souhaitez mettre à jour plus d'un doc

EDIT: Depuis la version 3.2 est une fonction db.collection.updateMany(filter, update, options) qui peut être utilisée pour mettre à jour plusieurs documents.

https://docs.mongodb.com/manual/reference/method/db.collection.updateMany/

db.people.updateMany(
    { "title": "search_term" }, 
    { "$push": { "tags": "search_term" } } 
); 

* non testé

+0

Merci! va essayer, il semble que cela fonctionnerait! –

+0

Je pense que mon problème ici est que le champ de titre ne contient pas seulement le "search_term" mais peut contenir des combinaisons comme "terms search_term terms" est-il un moyen de faire correspondre ces cas? –

+1

Got it, utilisé la requête dans le commentaire de la question, ne l'a pas vu beaucoup plus tard (Doh!) Merci beaucoup les gars! –