2012-06-15 5 views
2

MongoDB에서 다른 모음 (두 개의 일반 필드가 있고 db가 변경되지 않음)의 두 문서에서 데이터를 가져와야합니다. 나는 초보자이며 이것으로 나를 도울 수있다.2 개의 문서가 MongoDB에서 병합합니다.

a = db.users.find(username:'[email protected]') 
b = db.tasks.find(username:'[email protected]') 

a와 b가 병합 된 변수 c를 얻는 방법?

도와주세요. 이것은 사소한 일이지만 도움이 될 수 있습니다.

+1

"병합"이란 단어를 명확히 할 수 있습니까? 당신이 참여하고 싶은 것처럼 들리네. –

답변

0

데이터 집계를 위해서는 MongoDB의지도/축소 기능에 익숙해 져야합니다. 자세한 내용은 here을 참조하십시오.

일단 파악하면 Map (데이터 검색) 및 Reduce (데이터 집계) 기능을 작성하는 것이 어렵지 않습니다.

2

BSON API에서 merge() method을 사용할 수 있습니다. 그것은 a와 결합 된 b를주고 b에 결과를 저장합니다. 그것을하기 전에 c로 b를 복사 할 수 있습니다.

0

애플리케이션에서이 작업을 수행해야합니다. 두 개의 쿼리를 실행하는 것에 대해 걱정하지 마십시오. 하나의 복잡한 쿼리를 실행하는 것보다 느려질 필요는 없습니다.

+0

항상 쉬운 방법을 사용하지 않아야합니다. 장기적으로 성능 문제가 발생할 수 있으며 여러 쿼리를 수행하여 추가 된 오버 헤드를 쉽게 줄일 수 없습니다. –

+0

어쩌면 맵 축소를 사용하는 것은 엔지니어링에 대한 것입니다. – Derick

+0

물론, 어쩌면 :). –

2

find()는 커서를 반환하기 때문에 사용자가 두 컬렉션에서 고유 한 경우 findOne() 함수를 사용하십시오. 희망이 당신의 문제를 해결

function mergeObjects(a,b) { 
    res = new Object(); 

    for (attr in a) 
      res[attr] = a[attr]; 
    for (attr in b) 
      res[attr] = b[attr]; 

    // only if you wanna save it in a document again 
    delete res["_id"]; 
    return res; 
} 

a = db.users.findOne({"username" : '[email protected]'}) 
b = db.tasks.findOne({"username" : '[email protected]'}) 
c = mergeObjects(a,b) 

: 그래서 당신이 울부 짖는 소리 코드를 사용할 수 있습니다 콘솔 MongoDB를 두 개체의 병합을 달성했다.

0

아마 당신의 경우는 아니지만, clojure를 사용하는 경우 mongo에서 문서를 검색 한 후 merge-with 함수를 사용하는 것이 가장 좋은 해결책입니다.

(def a { 
     :scA {:a [1, 2]} 
     :scB {:b [3, 4]} 
}) 
; {:scA {:a [1 2]}, :scB {:b [3 4]}} 

(def b { 
     :scA {:c [5, 6]} 
     :scC {:d [7, 8]} 
}) 
; {:scA {:c [5 6]}, :scC {:d [7 8]}} 

(merge-with into a b) 
; {:scA {:a [1 2], :c [5 6]}, :scB {:b [3 4]}, :scC {:d [7 8]}} 
관련 문제