将猫鼬文档转换为 json

我以 json 的身份返回猫鼬医生:

UserModel.find({}, function (err, users) {
return res.end(JSON.stringify(users));
}

但是,user. _ _ proto _ _ 也被返回了。没有它我怎么返回呢? 我试过这个,但是没有用:

UserModel.find({}, function (err, users) {
return res.end(users.toJSON());    // has no method 'toJSON'
}
153786 次浏览

First of all, try toObject() instead of toJSON() maybe?

Secondly, you'll need to call it on the actual documents and not the array, so maybe try something more annoying like this:

var flatUsers = users.map(function() {
return user.toObject();
})
return res.end(JSON.stringify(flatUsers));

It's a guess, but I hope it helps

I found out I made a mistake. There's no need to call toObject() or toJSON() at all. The __proto__ in the question came from jquery, not mongoose. Here's my test:

UserModel.find({}, function (err, users) {
console.log(users.save);    // { [Function] numAsyncPres: 0 }
var json = JSON.stringify(users);
users = users.map(function (user) {
return user.toObject();
}
console.log(user.save);    // undefined
console.log(json == JSON.stringify(users));    // true
}

doc.toObject() removes doc.prototype from a doc. But it makes no difference in JSON.stringify(doc). And it's not needed in this case.

You may also try mongoosejs's lean() :

UserModel.find().lean().exec(function (err, users) {
return res.end(JSON.stringify(users));
});

回答晚了,但是您也可以在定义模式时尝试这样做。

/**
* toJSON implementation
*/
schema.options.toJSON = {
transform: function(doc, ret, options) {
ret.id = ret._id;
delete ret._id;
delete ret.__v;
return ret;
}
};

请注意,ret是 JSON’ed 对象,它不是猫鼬模型的实例。您将在对象散列上对其进行操作,而不使用 getters/setter。

然后:

Model
.findById(modelId)
.exec(function (dbErr, modelDoc){
if(dbErr) return handleErr(dbErr);


return res.send(modelDoc.toJSON(), 200);
});

编辑: 2015年2月

因为我没有提供缺少 toJSON (或 toObject)方法的解决方案,所以我将解释我的用法示例和 OP 的用法示例之间的区别。

观众:

UserModel
.find({}) // will get all users
.exec(function(err, users) {
// supposing that we don't have an error
// and we had users in our collection,
// the users variable here is an array
// of mongoose instances;


// wrong usage (from OP's example)
// return res.end(users.toJSON()); // has no method toJSON


// correct usage
// to apply the toJSON transformation on instances, you have to
// iterate through the users array


var transformedUsers = users.map(function(user) {
return user.toJSON();
});


// finish the request
res.end(transformedUsers);
});

我的例子:

UserModel
.findById(someId) // will get a single user
.exec(function(err, user) {
// handle the error, if any
if(err) return handleError(err);


if(null !== user) {
// user might be null if no user matched
// the given id (someId)


// the toJSON method is available here,
// since the user variable here is a
// mongoose model instance
return res.end(user.toJSON());
}
});
model.find({Branch:branch},function (err, docs){
if (err) res.send(err)


res.send(JSON.parse(JSON.stringify(docs)))
});

您可以使用 res.json ()来 jsonify 任何对象。 Lean ()将删除猫鼬查询中的所有空字段。

Find () . lean () . exec (function (err,users){ 返回 res.json (用户) ; }

试试以下选项:

  UserModel.find({}, function (err, users) {
//i got into errors using so i changed to res.send()
return res.send( JSON.parse(JSON.stringify(users)) );
//Or
//return JSON.parse(JSON.stringify(users));
}

也许这个答案有点误入歧途,但是如果有人想用相反的方法,您可以使用 Model.hydrate()(自 monose v4)将 javascript 对象(JSON)转换为 monose 文档。

一个有用的例子是当您使用 Model.aggregate(...)时。因为它实际上返回的是普通的 JS 对象,所以您可能需要将它转换成一个猫鼬文档,以获得对 Model.method的访问(例如,在模式中定义的虚拟属性)。

附言。我认为它应该有一个线程运行像“ 将 json 转换为 Mongoose 文档”,但实际上没有,因为我已经找到了答案,所以我认为这是不好的,做自我发布和自我答复。

这对我很有效:

Products.find({}).then(a => console.log(a.map(p => p.toJSON())))


另外,如果你想使用 getter,你也应该添加它的选项(在定义模式时) :

new mongoose.Schema({...}, {toJSON: {getters: true}})

有那么一瞬间,我还在嘲笑这有多麻烦,因为这一定是非常普遍的。

没有费心去挖掘文件,而是把它们拼凑在一起。

        const data =   await this.model.logs.find({ "case_id": { $regex: /./, $options: 'i' }})
let res = data.map(e=>e._doc)
res.forEach(element => {
//del unwanted data
delete element._id
delete element.__v
});
return res
  1. 首先,我得到所有对 case _ id 字段有任何值的文档(只是得到集合中的所有文档)
  2. 然后通过 array.map 从猫鼬文档中获取实际数据
  3. 通过直接变异 i 删除物体上不需要的道具