从猫鼬文档中获取纯JavaScript对象(或JSON就绪对象)



给定从.save方法或任何其他返回文档的方法创建的文档,如何将该文档转换为具有原始JSON类型的纯javascript对象?我已经尝试了.toJSON.toObject但是当我想要一个字符串时,它们仍然保持猫鼬的ObjectId数据类型:

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test', {
useNewUrlParser: true,
useUnifiedTopology: true
});
const Cat = mongoose.model('Cat', { name: String });
const kitty = new Cat({ name: 'aed' });
kitty.save()
.then(data => {
console.log(data.toObject()._id instanceof mongoose.Types.ObjectId)
console.log(data.toJSON()._id instanceof mongoose.Types.ObjectId)
console.log(data.toObject({ virtuals: true, getters: true })._id instanceof mongoose.Type.ObjectId)
console.log(data.toJSON({ virtuals: true, getters: true })._id instanceof mongoose.Types.ObjectId)
return data
})
.then(data => data.remove())
.catch(console.error);
true
true
true
true

我知道我可以使用.lean(),但我特别需要文档及其普通对象版本

提前致谢

您可以先使用toObject

,然后使用JSON.stringify,然后使用JSON.parse

router.post("/cat", (req, res) => {
const kitty = new Cat({ name: "Masha" });
kitty.save().then(data => {
const obj = data.toObject();
const str = JSON.stringify(obj);
const json = JSON.parse(str);
console.log(typeof json._id);
res.send(data);
});
});

console.log(typeof json._id)的结果将是string.

同样要删除版本键,我们可以在架构定义中应用 false 选项versionKey

const mongoose = require("mongoose");
const catSchema = new mongoose.Schema({ name: String }, { versionKey: false });
const Cat = mongoose.model("Cat", catSchema);
module.exports = Cat;

您可以传播该文档(请参阅下面的示例(。但在这种情况下,您将失去从父原型扩展的属性。

console.log({...数据}(;

最新更新