>  Q&A  >  본문

mongodb实现exists去重

db.getCollection('user').save({"uid":"1123", "logTime":ISODate('2016-05-23 11:11:23')});
db.getCollection('user').save({"uid":"1124", "logTime":ISODate('2016-05-23 05:11:23')});
db.getCollection('user').save({"uid":"1125", "logTime":ISODate('2016-05-23 08:11:23')});
db.getCollection('user').save({"uid":"1126", "logTime":ISODate('2016-05-23 09:12:23')});
db.getCollection('user').save({"uid":"1127", "logTime":ISODate('2016-05-23 11:23:23')});
db.getCollection('user').save({"uid":"1134", "logTime":ISODate('2016-05-23 11:11:23')});
db.getCollection('user').save({"uid":"1123", "logTime":ISODate('2016-05-21 11:11:23')});
db.getCollection('user').save({"uid":"1125", "logTime":ISODate('2016-05-22 11:11:23')});
db.getCollection('user').save({"uid":"2343", "logTime":ISODate('2016-04-23 11:11:23')});
db.getCollection('user').save({"uid":"9873", "logTime":ISODate('2016-04-23 11:11:23')});
db.getCollection('user').save({"uid":"4321", "logTime":ISODate('2016-04-20 11:11:23')});

上面模拟一些数据 生产一个user集合来表示用户登录状况. 现在我想查询2016-05-23的新用户数(5-23号登录的用户但是在小于5-23号的记录中不存在) 比如第一条记录uid='1123'在5-21也登录过 那么uid='1123'就不算在5-23登录的用户数中

天蓬老师天蓬老师2727일 전760

모든 응답(2)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-05-02 09:21:34

    Mongodb는 조인을 지원하지 않습니다. 다음 방법으로 목적을 달성할 수 있습니다

    으아아아

    회신하다
    0
  • 淡淡烟草味

    淡淡烟草味2017-05-02 09:21:34

    5~23일에 로그인한 사용자는 5~23일 미만의 기록에 존재하지 않습니다

    우선 이 디자인에는 명백한 결함이 있습니다.

    1. 실적 불량: 23일 미만의 기록이 너무 많습니다. 1년 전, 2년 전, 10년 전이 모두 5월 23일 미만인 경우, 얼마나 더 앞으로 스캔해야 합니까? 처음에는 데이터가 며칠만 있으면 괜찮지만, 로그 수가 늘어나면 프로그램이 점점 더 힘들게 실행됩니다. 그리고 그 과정은 빠르게 진행될 것입니다. 이때, 오래된 로그를 삭제하려고 생각하게 되는데, 다음과 같은 문제가 발생하게 됩니다.

    2. 유지관리 어려움: 로그인 로그는 용량이 크고 일반 사람들에게는 그다지 유용하지 않으며 영구적으로 보관하는 사람은 거의 없습니다. 1년 전의 로그를 삭제하면 첫 번째 로그인 로그가 귀하에 의해 삭제되었을 수 있으므로 새로운 신규 사용자 집단이 탄생할 수 있습니다.

    그리고 일반적으로 신규 사용자를 신규 등록 사용자라고 하지 않나요? 이 알고리즘을 사용하여 신규 사용자를 찾아야 하는 특별한 이유가 있나요?
    처음 로그인한 날을 신규 사용자 시간으로 계산해야 한다면 다시 디자인하는 것이 좋습니다. 예를 들어, 사용자 테이블을 기반으로 로그인하지 않은 사용자를 찾아 정기적으로 로그인 로그를 검색하면 해당 사용자 테이블에 첫 번째 로그인 날짜를 기록합니다. 이런 식으로 이론상으로는 아무리 시간이 걸려도 등록은 했지만 로그인을 하지 않은 사용자 수는 크게 변하지 않을 것입니다. 그러나 결국 소수입니다), 프로그램 성능은 시간이 지나도 저하되지 않습니다.

    저는 귀하의 질문에 직접적으로 대답하지 않습니다. 왜냐하면 저의 평소 경험에 따르면 문제를 근본적으로 해결해야 하고 실수에 기초한 패치를 하면 상황이 점점 더 악화될 것이기 때문입니다.

    PS: 마지막 문장의 논리에 문제가 있나요?

    회신하다
    0
  • 취소회신하다