0

エントリのリストを取り、monger を使用して mongo に保存する機能があります。奇妙なのは、指定しない限り、1 つのレコードのみが更新され、残りは無視されることmulti:trueです。モンガーがmongodbへのすべての更新を永続化するためにマルチフラグが必要な理由がわかりません。

(defn update-entries
   [entries]
   (let [conn (mg/connect)
         db (mg/get-db conn "database")]
     (for [e entries] (mc/update db "posts" {"id" (:id e)} {$set {:data (:data e)}} {:multi true}))))
4

1 に答える 1

2

multi フラグは、mongo 自体が使用するものであるため、複数の更新に必要です。updateのドキュメントをご覧ください。確かに、それは mongo シェルですが、操作のセマンティクスに関しては、ほとんどのドライバーが従おうとします。

が一意の場合"id"、一度に 1 つのレコードを更新しているため、 に:multi設定してtrueも問題ないことに注意してください。

ただし、コードには別の問題があります。

内包表記を使用すると、コレクションが遅延forして反復されます。つまり、 によって返されるコレクションの実現を強制するまで、 の呼び出しは行われません。mc/updatefor

mc/update副作用(データベース内のレコードを更新する)のために行われた呼び出しであるため、結果が必要でない限り、使用 するdoseq方が適切です。

その場合は、ラップforインdoallして実現を強制します。

(doall 
    (for [e entries] 
         (mc/update db "posts" {"id" (:id e)} {$set {:data (:data e)}} {:multi true})))))
于 2014-09-27T17:36:47.030 に答える