2017-10-17 2 views
0

Je ne trouve pas de solution efficace pour ma requête. Voici ce que j'aimerais faire.Requête Mongo: Copier le champ + valeur d'un document à l'autre

J'ai une collection appelée document « presse » j'ai une collection appelée « pistes »

« versions » a le champ « ReleaseDate », qui est rempli pour chaque « libère ».

Je voudrais maintenant avoir le releaseDate correspondant de "releases" dans chaque document "pistes" sous db.tracks.releases.releaseDate (db.tracks.releases existe déjà, mais sans le releaseDate).

Pour trouver le correspondant ReleaseDate, "versions" et "pistes" les deux ont un numéro de ICPn:

db.releases.icpn db.tracks.releases.icpn

Ceux-ci peuvent être comparés à trouver la releaseDate correcte pour chaque piste.

Pour résumer: Je dois parcourir chaque piste, regarder l'ICPN, rechercher la version avec le même ICPN et copier le releaseDate de la version à la piste.

je ne pouvais le faire fonctionner comme ceci:

db.releases.find() forEach (function (doc) {

db.tracks.update( 


       { "releases.0.ICPN" : doc.ICPN}, 
       { 
        $set: { "releases.0.releaseDate": doc.releaseDate}, 
        $currentDate: {"lastModified": true} 
       }, 
       { multi: true} 

      )  

})

qui a fonctionné pour mon test. DB, mais il est extrêmement inefficace de parcourir chaque piste pour chaque version.

Avez-vous des conseils pour me mettre sur la bonne voie?

Meilleures salutations, Alex

Répondre

0

Actuellement cette requête ne trouve que docs où le premier élément de presse est ICPn

Vous souhaitez interroger sans index absolu comme:

et mise à jour avec l'opérateur positionnel afin qu'il mette à jour celui trouvé:

$set: { "releases.$.releaseDate": doc.releaseDate}, 
+0

D'accord, je vois. Il est devenu totalement confus là. –

+0

(enlevé le commentaire) –

0

Eh bien, la requête fonctionne partiellement maintenant, mais elle s'arrête après avoir édité 1700 pistes (de 160000), bien que je mette multi à true et que la condition soit vraie pour toutes les autres pistes/releases (j'ai vérifié certaines pistes non modifiées si ICPNs correspond) .

+0

J'ai dû augmenter le temps d'exécution du shell. La valeur par défaut était de 15 secondes seulement. –