2013-03-10 3 views
2

나는 시도 다음MongoDB의 고유 인덱스

db.Wall.ensureIndex({event_time : 1}, {unique: true}) 

하지만이 출력은

{ 
    "err" : "E11000 duplicate key error index: scrap.Wall.$event_time_1 dup key: { : new Date(0) }", 
    "code" : 11000, 
    "n" : 0, 
    "connectionId" : 10, 
    "ok" : 1 
} 

내가 getIndexes을 시도하지만 EVENT_TIME가 표시되지 않습니다 계속 표시 데이터의 경우

+0

, 당신은 고유 인덱스를 만들 수 없습니다. – beny23

+0

날짜가 아직 설정되지 않았 음을 나타내는 Date (0)를 사용하는 경우 중복 값이 ​​날짜 (0) 인 것처럼 보입니다.이 값을 0으로 설정하지 않는 것이 좋지만 null로 설정 한 다음 고유 한 스파 스 색인은 집합 날짜가 고유해야한다는 것을 강요합니다. –

답변

3

당신은 중복 값 인덱스를 만들 수 없습니다. 중복 값을 찾기위한 하나 쉬운 방법은, 따라서, MongoDB의 쉘에서, aggregate 쿼리를 사용하는 것입니다 : 하나 개 이상의 Wall 문서에 존재하는 모든 event_time 값의 목록을 반환합니다

db.Wall.aggregate([ 
     {$group : { _id: "$event_time" , count : { $sum: 1}}}, 
     {$match : { count : { $gt : 1 } }} ]) 

.

는 설명 : event_time 각 그룹 event_time (_id: "$event_time")

  • (고유 시간)

    1. 그룹 카운트이어서 (count: { $sum: 1})
    2. 한 추가는 그룹 만 여기서 일치 count이 1보다 큰 경우

    그런 다음 문제의 빈도를 결정할 수 있습니다. 아래 그림과 같이 findevent_time 값을 입력하여 일치하는 항목을 모두 find 수 있습니다. 물론 아직 색인이 생성되지 않은 상태에서 빠르지는 않습니다. 다른 답변에서와 같이 :

    db.Wall.find({ 'event_time' : /* one of the event times */ }) 
    

    그리고 물론

    , 그냥 강제로 삭제할 수 있습니다 중복 (dropDups). 그러나 인덱싱 단계에서 찾은 첫 번째 문서 만 유지하고 다른 모든 문서는 제거되므로 결과가 비 결정적으로 보일 수 있습니다. 당신이 순간에 당신의 수집에 event_time``에서 중복 값을 가지고있는 경우에

  • 3

    거기 wall 컬렉션 구분하지 않습니다 당신이 호출 할 수 있습니다

    db.Wall.ensureIndex({event_time : 1}, {unique: true, dropDups: true}) 
    

    하지만 모든 중복일 것입니다.! 같이

    +0

    감사합니다.이 사람이 일부 문서를 삭제했습니다;) – user2152066