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)
我知道这是旧的,但我有类似的问题。要解决此问题,请使用 .lean()。
精益选项告诉 Mongoose 跳过对结果文档进行补水。这使得查询速度更快,内存占用更少,但结果文档是普通的旧 JavaScript 对象 (POJO),而不是 Mongoose 文档。
所以你的查询是:
PatientOrderMigration.find({ mrn: orderitem.mrn, visituid: orderitem.visituid }).lean()
Run Code Online (Sandbox Code Playgroud)
起源问题是该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)
好吧,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)
| 归档时间: |
|
| 查看次数: |
3383 次 |
| 最近记录: |