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登录的用户数中
淡淡烟草味2017-05-02 09:21:34
5-23にログインしたユーザーは5-23より前のレコードには存在しません
まず第一に、このデザインには明らかな欠陥があります。
パフォーマンスの問題: 1 年前、2 年前、10 年前はすべて 5 月 23 日よりも前のレコードが多すぎます。どこまでスキャンする必要がありますか?最初はデータが数日しかない場合は問題ないかもしれませんが、ログの数が増加するにつれて、プログラムの実行はますます難しくなります。そしてプロセスは迅速に進みます。このとき、古いログを削除しようと考えると、以下のような問題が発生します。
維持が難しい: ログイン ログは量が多く、一般の人にはあまり役に立たず、永久に保存する人はほとんどいません。 1 年前のログを削除すると、最初のログインのログが削除されている可能性があるため、新しいユーザーのグループが新たに誕生することが考えられます。
また、通常、新規ユーザーとは新しく登録されたユーザーを指すのではないでしょうか? 新規ユーザーを見つけるためにこのアルゴリズムを使用しなければならない特別な理由はありますか?
最初のログイン日を新規ユーザー時間としてカウントする必要がある場合は、再設計することをお勧めします。たとえば、ユーザー テーブルに基づいて、ログインしていないユーザーを検索し、定期的にログイン ログを検索して、最初のログイン日をユーザー テーブルに記録します。このように、理論上、登録はしたもののログインをしていないユーザーの数はどれだけ時間がかかってもあまり変化しないことになります(変わらないわけではなく、実際に登録はしているがログインをしていないユーザーは存在します)はありますが、結局は少数です)、プログラムのパフォーマンスは時間の経過とともに低下しません。
はあなたの質問に直接答えていません。なぜなら、私の普段の経験から、間違いに基づいてパッチを適用するのではなく、問題を根本的に解決する必要があるからです。そうすれば状況はますます悪化するだけです。
追伸: 最後の文の論理に問題はありますか?