2014-09-27 3 views
0

monger를 사용하여 항목 목록을 받아 mongo에 저장하는 기능이 있습니다. 이상한 점은 multi:true을 지정하지 않으면 한 레코드 만 업데이트되고 나머지 레코드는 무시된다는 것입니다. monger가 mongodb에 대한 모든 업데이트를 유지하기 위해 다중 플래그가 필요한 이유를 모르겠습니다.monger가 목록의 모든 레코드 대신 하나의 레코드 만 업데이트하는 이유

(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})))) 

답변

2

멀티 플래그는 다중 업데이트에 필요합니다. mongo 자체에서 사용하기 때문입니다. update에 대한 설명서를 살펴보십시오. 그것이 mongo 쉘이지만, 대부분의 운전자는 운영 의미론에 관해서는 따라하려고합니다.

"id"이 고유하면 :multitrue으로 설정해야하므로 한 번에 하나의 레코드를 업데이트해야합니다.

그러나 코드에 또 다른 문제가 있습니다.

당신은 차례로 모음 느리게, 즉 당신이 for에 의해 반환 된 컬렉션의 실현을 강제 때까지 mc/update로 만든되지 않습니다 호출을 반복 할 for 이해를 사용합니다.

mc/update은 부작용 (db의 레코드 업데이트)을위한 호출이기 때문에 결과가 필요하지 않는 한 doseq을 사용하면 더 적합합니다. 내가 원래`doseq`을 사용

(doall 
    (for [e entries] 
     (mc/update db "posts" {"id" (:id e)} {$set {:data (:data e)}} {:multi true}))))) 
+0

하지만 출력을 볼'for'로 변경 그래서 업데이트를보고 있지 않다 때문에 :

그런 경우에는 실현을 강제로 doallfor 포장. 나는 당신이 설명했던 것을 이해하고, 당신이 'id'와 일치하여 멀티라고 설정했기 때문에 스스로 그렇게 말했습니다 : 사실은 중요하지 않아야합니다 - 그러나 이것이 내가 이해하려고하는 문제입니다. –

+1

@SeymourCakes 결과가 필요하면'doseq' 대신'doall'을 사용할 수 있습니다. 어쨌든 당신은 어떻게 든 시퀀스 실현을 강제 할 필요가 있습니다. – soulcheck