mongoose - Mongoose 在读取/查找时删除不在架构上的字段
问题描述
我有一个架构:
const LinkSchema = new mongoose.Schema({
name: { type: String },
style: { default: "icon", type: String },
});
还有一个已经在 mongoDB 中的文档,其中可能包含许多旧字段。
{
"name": "abcLink",
"oldThing1": true,
"oldThing2": "oeunth",
....
"oldThing100": "hi",
}
我想link.findOne({ name: "abcLink" })
回来
{
"name": "abcLink",
"style": "icon"
}
目前,我得到
{
"name": "abcLink",
"oldThing": true,
"style": "icon"
}
如何strict
读取以获取未返回架构中未定义的任何字段的过滤对象?
因为我们有 30 多个活动字段和许多非活动字段,所以我们可以定义一次架构,然后自动过滤结果,这一点很重要。我们不想在多个地方重复有效或无效字段。注意:使用类似于Object.keys
模式的函数来获取有效字段的数组并使用它进行过滤是完全可以接受的。
解决方案
您可以使用这样的转换函数覆盖该toJSON
方法,以便它没有任何不在架构中的字段。
const mongoose = require("mongoose");
const LinkSchema = new mongoose.Schema({
name: { type: String },
style: { default: "icon", type: String }
});
var schemaFields = Object.keys(LinkSchema.paths);
LinkSchema.set("toJSON", {
transform: function(doc, ret, options) {
let result = {};
Object.keys(ret).map(key => {
if (schemaFields.includes(key)) {
result[key] = ret[key];
}
});
return result;
}
});
module.exports = mongoose.model("Link", LinkSchema);
更新为评论中提到的@Loren,对于我们可以使用的嵌套对象Object.keys(LinkSchema.tree)
而不是Object.keys(LinkSchema.paths)
.
推荐阅读
- java - 我从firebase数据库获取数据并保存到ArrayList,但是当我运行progrem时它为空
- python-3.x - 如何让我的 smartThings python3 脚本在 apache 网络服务器上作为 cgi 文件运行
- python - 在产生第一个项目后如何使用不同的参数再次调用第一个解析函数以产生另一个项目
- arrays - Rust“未实现特征 `std::array::LengthAtMost32`”
- php - 如何从 Laravel Homestead 的存储文件夹中访问图像(符号链接问题)?
- java - 如何在 TreeMap 中将当前类的实例作为值返回?
- ios - 无法发出将 tokenID 插入 request_token 字段的 POST 请求
- python - 查找具有相同字符串值的组的索引
- javascript - 如何使用 BeautifulSoup 从 indiegogo 抓取项目 url?
- python - 想要根据位置获取产品可用数量(odoo 12)