2014-04-11 2 views
0

mongoDB 투영에서 중복 레코드를 제거하려면 어떻게해야합니까? 나는 다음과 같은 형태로 내 몽고 문서가 있다고 가정하자 - MongoDB : 투영에서 중복 레코드 제거

{"_id":"55555454", "From":"Bob", "To":"Alice", "subject":"Hi", "date":"04102011"} 
{"_id":"55555455", "From":"Bob", "To":"Dave", "subject":"Hello", "date":"04102014"} 
{"_id":"55555456", "From":"Bob", "To":"Alice", "subject":"Bye", "date":"04112013"} 

나는 투사 할 db.col.find({}, {"From":1, "To":1, "_id"=0})

분명 저에게이 같은 세 가지 기록을 줄 것이다 할

. {: "밥", "받는 사람" "에서" "데이브"} { "에서": {: "밥", "받는 사람" "앨리스" "에서"}

"밥", "받는 사람": "앨리스"}

그러나 내가 원하는 것은 두 기록,이 방법입니다 -

{"From":"Bob", "To":"Alice"} {"From":"Bob","To":"Dave"} 

내 응용 프로그램이 현재 내가 무엇을하고 있는가하는 것은, (pymongo를 사용하여) 파이썬에서와 같이 사용중인 레코드 목록에서 해당 응용 프로그램의 중복을 제거하려고합니다.

result = [dict(tupleized) for tupleized in set(tuple(item.items()) for item in l)] 

투영에 적용 할 수있는 DB 방법이 있으며 두 레코드 만 제공합니다.

답변

1

당신은 감소 할 그냥 find MongoDB를하고 볼록 사용하여 중복 문서를 제거 할 수 있습니다.

find 명령은 커서가 클라이언트로 리턴되고 2 차 통과가없는 고유 한 문서로 결과를 줄일 수 없다는 것을 기억해야하므로 작동하지 않습니다.

> db.test.find() 
{ "From" : "Bob", "To" : "Alice", "subject" : "Hi", "date" : "04102011" } 
{ "From" : "Bob", "To" : "Dave", "subject" : "Hello", "date" : "04102014" } 
{ "From" : "Bob", "To" : "Alice", "subject" : "Bye", "date" : "04112013" } 
{ "From" : "Bob", "To" : "Alice", "subject" : "Hi", "date" : "04102011" } 
{ "From" : "Bob", "To" : "Dave", "subject" : "Hello", "date" : "04102014" } 
{ "From" : "Bob", "To" : "Alice", "subject" : "Bye", "date" : "04112013" } 
{ "From" : "Bob", "To" : "Dave", "subject" : "Hello", "date" : "04102014" } 
{ "From" : "Bob", "To" : "Alice", "subject" : "Bye", "date" : "04112013" } 
{ "From" : "George", "To" : "Carl", "subject" : "Bye", "date" : "04112013" } 
{ "From" : "David", "To" : "Carl", "subject" : "Bye", "date" : "04112013" } 

당신이 사용할 수있는 통합 :

> db.test.aggregate({ $group: { _id: { "From": "$From", "To": "$To" }}}) 

결과 :

{ 
    "result" : [ 
     { 
      "_id" : { 
        "From" : "David", 
        "To" : "Carl" 
      } 
     }, 
     { 
      "_id" : { 
        "From" : "George", 
        "To" : "Carl" 
      } 
     }, 
     { 
      "_id" : { 
        "From" : "Bob", 
        "To" : "Dave" 
      } 
     }, 
     { 
      "_id" : { 
        "From" : "Bob", 
        "To" : "Alice" 
      } 
     } 
], 
    "ok" : 1 
} 

Python 코드는 매우 유사합니다 테스트 데이터로이 사용

합니다 (_id 제거)를 위에 제시된 집계 파이프 라인에 연결하십시오.

0

투영은 결과에 표시 할 필드 만 정의합니다.

db.collection.find(
    { "From": "Bob", "To": "Alice" }, 
    { "From": 1, "To": 1 } 
) 

: 당신이 실제로하고 싶어 이것의 상당했다 그래서

SELECT * 

의 기본 형태에 반대

SELECT From, To 

: 그것은으로 시작하는 문장처럼 많이 실제로 원하는 레코드를 선택하며 다음과 같은 형식입니다 :

SELECT From, To 
FROM collection 
WHERE 
    From = "Bob" 
    AND To = "Alice" 

은 실제로 어떻게 든 당신이 골재의 사용과이를 제거 할 수 있습니다 결과 "중복"생산해야 :

db.collection.aggregate([ 
    { "$match": { 
     "From": "Bob", "To": "Alice" 
    }} 
    { "$group": { 
     "_id": { 
      "From": "$From", "To": "$To" 
     } 
    }}  
]) 
+0

답변 해 주셔서 감사합니다. 나는 투영이 무엇인지 이해하지만이 후에 더 많은 것을 원한다 - 투영 된 뷰에서 중복 된 아이템을 제거하라! – Adam

+0

@sanj 당신이 쿼리의 항목을 실제로 선택하지 않은 부분을 이해하지 못합니까? 그것은 또한 대답입니다. –

+0

@sanj 중단에도 불구하고 중복되는 경우 실제로 답변을 제공하는 것을 제공합니다. –