node.js - Mongoose .find 查询结果包含查询元数据?不能只是手动投影集合的每个属性,如何只获取文档?
问题描述
从后端检索到的文档数组看起来像这样:
41:
$__: {strictMode: true, selected: {…}, shardval: null, saveError: null, validationError: {…}, …}
$init: true
$locals: {}
errors: {undefined: {…}, files: {…}}
isNew: false
_doc: {status: "Finished", isOnHold: false, requirements: Array(0), files: Array(0), reportFileIds: Array(1), …}
__proto__: Object
每个项目的实际文档位于 _doc 下。这是 mongoose.Find 查询的结果:
let query = Job.find({
_id: {
$in: data.jobs
}
});
let result = await query.exec();
现在,如果我在发送之前尝试获取该结果数组的项目,它看起来不像前端实际建模的内容,这很奇怪。
有没有办法使用 mongoose.find 获取纯文档数组?我不能使用聚合查询,因为我不想手动投影每个可能的属性。
编辑:
这不是大声喊叫的重复,扩展语法与它无关,你看到我在任何地方提到扩展语法吗?这与猫鼬驱动有关。
Edit2:我最终循环遍历数组并在每个项目上调用 .toObject :
let jobs = await query.exec();
let result = [];
for (let doc of jobs) {
result.push(doc.toObject());
}
return result;
Edit3:最终调用query.lean().exec()
了正确的方法。我过去根据可能已过时的stackoverflow示例将精益部分用作参数,它只会返回文档的ID。但是像上面这样调用它可以正常工作。
解决方案
Mongoose 总是返回一个实例 mongoose 对象,默认情况下它是不可变的。要获取普通的 JS 对象,请尝试使用这样的lean()查询:
const query = Job.find({
_id: {
$in: data.jobs
}
});
let result = await query.lean().exec();
您可以阅读更多关于精益的信息:https ://mongoosejs.com/docs/tutorials/lean.html
希望这可以帮助 :)
推荐阅读
- vue.js - buefy 程序化模式从子级获取父级中的数据
- bash - 将文件拆分为 n 个文件的 Bash 脚本,每个文件包含 x 条记录
- swift - 所以我想找到刚刚编辑过的单元格的 indexPath.row,也就是在 func textViewDidEndEditing 内部
- python - 将多个 PIL 图像合并到一个图中
- typescript - 打字稿错误创建字段'('预期.ts(1005)
- javascript - How to send submitted form data to a local server
- android - XML中的片段/活动外的Android浮动配置文件图像
- php - 使用 JOB 和 Supervisor 时生成的附加到电子邮件的 PDF 失败。
- android - RecyclerView.onBindViewHolder 未填充所有项目
- functional-programming - 如何在不创建闭包的情况下调用多参数函数?