MongoDB动态加载

MongoDB dynamic loading

本文关键字:加载 动态 MongoDB      更新时间:2023-09-26

好的这是我在图像显示代码中的第一个函数:

function init() {
socket.on('getPictures', function(data) {
images = data;

loadImages();
});

console.log("loading");
socket.emit('getPictures');
}

'getPictures'调用使用db.collection.find({})返回数据库中的每个文档。这些文档具有名称、来源(64位字符串)等属性,以及客户端可以放在每张图片上的一些标记。Images是保存我所有文档的数组。

下面是mongo端代码:
socket.on('getPictures', function() {
  console.log("getting pictures");
    Picture.find({}, function(err, data) {
    if(err) console.log(err);
    else
      io.emit('getPictures', data);
     });
    });

通过使用db.collection.find({})方法,我一次接收了所有的图片,我的程序有一个荒谬的加载时间(因为有很多图片)。是否有任何方法我可以加载一次文件从mongo,然后将其放入图像?mongo是否有办法知道它是否已经完成了对某个文档的查询?如果是这样的话,我已经有了从图像动态创建和绘制每个画布的方法,所以我基本上可以消除它们繁重的加载时间。

我真的是新的javascript(和编程),所以我很抱歉,如果我没有提供足够的信息。我正在试着掌握窍门。

我想到了两种有用的方法。首先,您可以使用Mongoose(我猜您正在使用代码中的Mongoose)返回游标作为回调的参数,以便在从数据库查询返回图像时单独或批量发送图像。您可以控制批大小以找到适当的平衡。修改你的代码,

socket.on('getPictures', function() {
    console.log("getting pictures");
    Picture.find({}, function(err, cursor) {
        if(err)
            console.log(err);
        else
            cursor.each(function(err, doc) {
                io.emit('aPicture', doc);
            });
    });
});

然后绘制在客户端接收到的每个图片,关闭aPicture套接字事件。您可以通过修改find()回调来在发送到客户端之前积累一个数组或其他东西来批量发送而不是单个图片。

另一种方法依赖于两个假设:首先,您的客户端程序是一个浏览器,其次,您正在用简单的<img src=>类型的HTML标记显示图像。浏览器被优化为并行加载和呈现大量这些标签,因为大多数现代网站的页面都有许多图像。在这种情况下,您可以像现在一样获得所有结果,但是只需将_id或其他一些唯一标识符发送回客户机。然后有另一个可以调用的url,如/images/:_id,它将查找并响应图像的二进制数据,因此您可以创建一个动态图像标记,如<img src="/images/my_dog_ralphie.jpg">。你可以使用jQuery或其他东西,按顺序制作很多这些,然后它们都将异步加载并呈现实际图像,并与浏览器处理的细节并行。我不能说得太具体,因为我不知道你的应用程序的整个技术栈。