首页 > 解决方案 > mongoose 可以在一次查询中返回文档或仅返回其中一个字段吗?

问题描述

我有一个猫鼬模式,其中包含一组文档,这些文档被渲染为 SVG 的视觉表示。

目前,在客户端从服务器请求文档之后,渲染发生在客户端使用 D3。

由于数据本质上是一个快照,它是不可变的,服务器端渲染将节省客户端的大量时间和资源。

有没有办法将渲染存储在 MongoDB 中,以便我可以使用一个查询将未渲染的文档或其渲染返回给客户端,但不能同时返回两者?根据客户端收到的数据,它可以决定渲染它,还是简单地将渲染插入 HTML DOM?

另一种方法是查询渲染,如果没有结果,渲染、存储它,然后将渲染传递给客户端?

第二种选择可能是向文档引入一个状态,其中转换到“已发布”状态将触发要存储的渲染,并且(匿名)客户端只能查询已发布的文档?

蒂亚!

更新:根据要求添加示例。

假设 Mongoose 模式如下(为了清楚起见,缩写):

const exampleSchema = new mongoose.Schema({
    year: Number,
    release: String,
    name: String,
    rendering: String // this is the field to hold the rendered version
})

待渲染的数据主要存储在其他文档中,当渲染发生在 Express 中的业务逻辑函数中时,这些文档会被拉入,然后发送到客户端进行渲染。当没有预渲染可视化时,“rendering”字段应该为空/null(我在客户端的 HTML/CSS 布局中利用 SVG 的缩放功能独立于端点屏幕尺寸)

未渲​​染的示例将使用 JSEND 格式作为 JSON 消息发送到客户端(为了便于阅读,省略了引号):

{
    status: success,
    type: raw
    data: {
        _id: ...
        year: 2020
        release: A release name
        name: Example data
    }
}

但是,如果存在渲染,则 JSON 消息将如下所示:

{
    status: success,
    type: svg
    data: {
        _id: ...
        rendering: <svg>...</svg>
    }
}

我的目标是让 Mongoose 查询(或 MongoDB)在一个查询中完成此操作,因为每次客户端请求在屏幕上查看相应的渲染时都会执行此操作 - 这将使查询数量减半,从而降低负载数据库。

正如我所说,我愿意接受建议的替代解决方案;有关一些想法,请参阅原始帖子。

标签: node.jsmongodbmongoose

解决方案


推荐阅读