Mongoose 在 _doc 对象中返回数据

Pra*_*hBV 10 mongoose mongodb node.js

在 mongoose find 查询执行时,响应数据为多个对象,真实数据在 _doc 属性或字段中,它只出现在某些场景中。我可以通过获取 Obj._doc.something 来处理数据,但我无法编辑数据并保存(猫鼬模型函数)。请帮我解决这个问题。

注意:架构字段已动态添加。

PatientOrderMigration.find({ mrn: orderitem.mrn, visituid: orderitem.visituid },
function (err, orderDoc) 
{ 
//log data correctly.
console.log(orderDoc);
// undefined
console.log(orderDoc._id);
// correct data
console.log(orderDoc._doc._id);
}
Run Code Online (Sandbox Code Playgroud)

TSl*_*tis 7

我知道这是旧的,但我有类似的问题。要解决此问题,请使用 .lean()。

精益选项告诉 Mongoose 跳过对结果文档进行补水。这使得查询速度更快,内存占用更少,但结果文档是普通的旧 JavaScript 对象 (POJO),而不是 Mongoose 文档。

所以你的查询是:

PatientOrderMigration.find({ mrn: orderitem.mrn, visituid: orderitem.visituid }).lean()
Run Code Online (Sandbox Code Playgroud)


Đăn*_*inh 7

起源问题是该find方法返回一个数组,这是由接受的答案指出的。但是标题“Mongoose return data inside _doc object”涉及另一个常见错误。所以我想在这里继续我的研究。


当您使用 Mongoose API 查询数据(find、findOne、findById ..)时,Mongoose 会在响应中为您提供Mongoose Document类的实例,该实例与您的 Javascript 对象不同

您可以通过一些选项来获取 Javascript 对象,如文档中所述:

我创建了一个测试项目来演示这些方法,请随意测试:

const mongoose = require('mongoose');

// connect to database
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true, useUnifiedTopology: true });

// define the schema 
const kittySchema = new mongoose.Schema({
    name: String

    // this flag indicate that the shema we defined is not fixed, 
    // document in database can have some fields that are not defined in the schema
    // which is very likely
}, { strict: false });

// compile schema to model
const Kitten = mongoose.model('Kitten', kittySchema);

test();
async function test() {


    // test data
    const dataObject = { name: "Kitty 1", color: "red" };
    const firstKitty = new Kitten(dataObject); // attribute color is not defined in the schema

    // save in database
    firstKitty.save();

    // find the kitty from database
    // mongoose return a document object, which is different from our data object
    const firstKittyDocument = await Kitten.findOne({ name: "Kitty 1" });
    console.log("Mongoose document. _id :", firstKittyDocument._id); // _id of document
    console.log("Mongoose document. name :", firstKittyDocument.name); // "Kitty 1"
    console.log("Mongoose document. color :", firstKittyDocument.color); // undefined
    // --> the document contains _id and other fields that we defined in the schema

    // we can call the method .toObject to get the plain object
    console.log("Using .toObject() method. _id :", firstKittyDocument.toObject()._id); // _id of document
    console.log("Using .toObject() method. name :", firstKittyDocument.toObject().name); // "Kitty 1"
    console.log("Using .toObject() method. color :", firstKittyDocument.toObject().color); // "red"
    // --> Using .toObject() method, we get all the fields we have in the dataObject

    // or we can use lean method to get the plain old javascript object
    const firstKittyPOJO = await Kitten.findOne({ name: "Kitty 1" }).lean();
    console.log("Using .lean() method. _id :", firstKittyPOJO._id);  // _id of document
    console.log("Using .lean() method. name :", firstKittyPOJO.name); // "Kitty 1"
    console.log("Using .lean() method. color :", firstKittyPOJO.color); //"red"
    // --> Using .lean() method, we get all the fields we have in the dataObject
}
Run Code Online (Sandbox Code Playgroud)


lef*_*lia 4

好吧,Model.find()会给你在数据库上找到的对象数组,如果你想直接访问你的对象,你可以使用Model.findOne()

或者 => 快速修复:

PatientOrderMigration.find({ mrn: orderitem.mrn, visituid: orderitem.visituid },function (err, orderDoc) {

    orderDoc = orderDoc[0];//Here is the Fix, you can comment this if you use findOne

    orderDoc.mrn = "New Value you want to update";

    orderDoc.save(function(err, result){
           console.log('err',err)
   })
}}
Run Code Online (Sandbox Code Playgroud)