Node.js 节点js+;Mongodb选择特定文档计数的更好方法
选择用户数的更好方法是什么 如果用户数量增加,JavaScript过滤代码会正常工作吗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,
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 } });
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]
}
},
}
}
])