2017-10-17 10 views
0

私のクエリに効率的な解決策が見つかりません。ここに私がしたいことがあります。Mongo Query:ある文書から別の文書にフィールド+値をコピー

私は「トラック」

「リリース」と呼ばれるコレクションを持っている 「リリース」と呼ばれるコレクションを持っているが、すべての「リリース」文書のために満たされているフィールド「RELEASEDATE」を、持っています。

db.tracks.releases.releaseDate (db.tracks.releasesは既に存在しますが、releaseDateはありません)の下に、すべての "トラック"ドキュメントに対応するreleaseDateを "releases"にしたいと考えています。

対応RELEASEDATE、 "リリース" を見つけ、 "トラック" の双方には、Icpnは番号を持っている: db.releases.icpn

これら

db.tracks.releases.icpnを見つけるために比較することができます各トラックの正しいリリース日。

まとめてみましょう: 私はすべてのトラックを通過し、ICPNを見て、同じICPNでリリースを検索し、リリースからリリースまでトラックにコピーする必要があります。

私はそれがこのように動作させることができます:

db.releases.find私のテストのために働いていた()はforEach(機能(DOC){

db.tracks.update( 


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

      )  

})

。 DBを使用していますが、シングルリリースごとに各トラックを通過するのは非常に非効率的です。

正しい軌道に乗るためのヒントはありますか?

敬具、 アレックス

答えて

0

現在、そのクエリはのみのリリースでは、最初の要素があなたのような絶対的な指標なしで照会したいIcpnは

あるドキュメント見つける:

と更新を位置演算子を使用して一致するものを更新します。

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

さて、わかりました。それはそこで完全に混乱してしまった。 –

+0

(コメントを削除しました) –

0

これで、クエリは部分的に動作しますが、マルチをtrueに設定しても、1700トラック(160000)を編集した後で停止しますが、他のすべてのトラック/リリース(ICPNが一致すれば、 。

+0

シェル実行時間を増やす必要がありました。デフォルトはわずか15秒でした。 –

関連する問題