Maison > Questions et réponses > le corps du texte
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登录的用户数中
PHP中文网2017-05-02 09:21:34
Mongodb ne prend pas en charge la jointure, la méthode suivante peut atteindre votre objectif
var list = [];
db.getCollection('user').find({'logTime': {'$lt': ISODate('2016-05-23')}}, {'_id': 0, 'uid': 1}).forEach(function(item){
list.push(item['uid']);
});
db.getCollection('user').find({'logTime': {'$gte': ISODate('2016-05-23')}, 'uid': {'$nin': list}});
淡淡烟草味2017-05-02 09:21:34
L'utilisateur qui s'est connecté le 5-23 n'existe pas dans les enregistrements inférieurs au 5-23
Tout d’abord, cette conception présente des défauts évidents.
Défaut de performance : il y a trop d'enregistrements inférieurs au 23 ans, il y a 2 ans et il y a 10 ans, tous sont inférieurs au 23 mai. Jusqu'où devez-vous scanner ? Cela peut être bien s'il n'y a que quelques jours de données au début, mais à mesure que le nombre de journaux augmente, votre programme fonctionnera de plus en plus fort. Et le processus ira vite. À ce stade, vous penserez à supprimer les anciens journaux et les problèmes suivants surviendront.
Difficile à maintenir : les journaux de connexion sont volumineux et peu utiles aux gens ordinaires, et peu de personnes les conservent en permanence. Il est concevable que lorsque vous supprimez les journaux d'il y a un an, un nouveau groupe de nouveaux utilisateurs naisse, car les journaux de leur première connexion ont peut-être été supprimés par vous.
De plus, les nouveaux utilisateurs ne sont-ils pas généralement appelés utilisateurs nouvellement enregistrés ? Le jour de l'inscription compte. Y a-t-il une raison particulière pour laquelle cet algorithme doit être utilisé pour trouver de nouveaux utilisateurs ?
Si le jour de la première connexion doit être compté comme temps de nouvel utilisateur, il est alors recommandé de le repenser. Par exemple, en fonction de la table utilisateur, recherchez les utilisateurs qui ne se sont pas connectés, puis recherchez régulièrement leurs journaux de connexion. Une fois trouvé, enregistrez la première date de connexion dans la table utilisateur. De cette façon, en théorie, peu importe le temps que cela prend, le nombre d'utilisateurs qui se sont inscrits mais ne se sont jamais connectés ne changera pas beaucoup (ce n'est pas qu'il n'y aura pas de changement, il y a effectivement des utilisateurs qui se sont inscrits mais ne se sont jamais connectés). (mais ils sont peu nombreux après tout), les performances de votre programme ne se détérioreront pas avec le temps.
Je ne réponds pas directement à votre question, car mon expérience habituelle me dit de résoudre le problème de manière fondamentale et de ne pas patcher sur la base d'une erreur, ce qui ne fera qu'aggraver la situation.
PS : Y a-t-il un problème avec la logique de votre dernière phrase ?