Node.js 节点js+;Mongodb选择特定文档计数的更好方法

Node.js 节点js+;Mongodb选择特定文档计数的更好方法,node.js,mongodb,optimization,mongodb-query,Node.js,Mongodb,Optimization,Mongodb Query,选择用户数的更好方法是什么 如果用户数量增加,JavaScript过滤代码会正常工作吗 使用多个mongodb请求 const db = fastify.mongo.db; const users_collection = await db.collection('users'); let users = { registered: { count: null, typed_count: { vk: null,

选择用户数的更好方法是什么

如果用户数量增加,JavaScript过滤代码会正常工作吗

  • 使用多个mongodb请求

     const db = fastify.mongo.db;
     const users_collection = await db.collection('users');
    
     let users = {
         registered: {
             count: null,
             typed_count: {
                 vk: null,
                 ok: null,
                 google: null,
                 oneclick: null,
             },
         },
     };
    
     users.registered.count = await users_collection.countDocuments();
     users.registered.typed_count.vk = await users_collection.countDocuments({ 'social.vk': { $exists: true } });
     users.registered.typed_count.ok = await users_collection.countDocuments({ 'social.ok': { $exists: true } });
     users.registered.typed_count.google = await users_collection.countDocuments({ 'social.google': { $exists: true } });
     users.registered.typed_count.oneclick = await users_collection.countDocuments({ social: { $exists: false } });
    
  • 使用一个mongodb请求和javascript过滤

     const db = fastify.mongo.db;
     const users_collection = await db.collection('users');
    
     let users = {
         registered: {
             count: null,
             typed_count: {
                 vk: null,
                 ok: null,
                 google: null,
                 oneclick: null,
             },
         },
     };
    
     const data = await (await users_collection.find()).toArray();
     users.registered.count = data.length;
     users.registered.typed_count.vk = data.filter((obj) => obj.social && obj.social.vk).length;
     users.registered.typed_count.ok = data.filter((obj) => obj.social && obj.social.ok).length;
     users.registered.typed_count.google = data.filter((obj) => obj.social && obj.social.google).length;
     users.registered.typed_count.oneclick = data.filter((obj) => !obj.social).length;
    

  • 第一种方法将花费更多时间,因为涉及太多的
    网络请求


    第二种方法将占用太多的
    服务器内存(RAM)
    ,因为所有文档都将首先进入内存

    因此,我们可以通过使用MongoDB
    聚合的
    $group
    管道来减少时间和内存,该管道类似于

    db.collection.aggregate([
      {
        $group: {
          _id: null,
          vk: {
            $sum: {
                $cond: [{ $gt: ["$social.vk", null]}, 1, 0]
            }
          },
          ok: {
            $sum: {
              $cond: [{ $gt: ["$social.ok", null]}, 1, 0]
            }
          },
          google: {
            $sum: {
              $cond: [{ $gt: ["$social.google", null]}, 1, 0]
            }
          },
          oneclick: {
            $sum: {
              $cond: [{ $lte: ["$social", null]}, 1, 0]
            }
          },
          
        }
      }
    ])