首页 > 解决方案 > 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。但是像上面这样调用它可以正常工作。

标签: node.jsmongodbmongoosemongodb-query

解决方案


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

希望这可以帮助 :)


推荐阅读