const generatedEvent = await Event.create(req.body);
res.send(generatedEvent);
我从请求的主体中获取一些数据,并可以生成一个新的事件。当事件生成后,我将其返回给客户端。但我不想返回事件的所有字段,我想进行过滤操作,类似于我们使用选择函数的方式:
Event.find().select({title:1,description:1})
我如何在Model.create中使用这个select函数?
const generatedEvent = await Event.create(req.body);
res.send(generatedEvent);
我从请求的主体中获取一些数据,并可以生成一个新的事件。当事件生成后,我将其返回给客户端。但我不想返回事件的所有字段,我想进行过滤操作,类似于我们使用选择函数的方式:
Event.find().select({title:1,description:1})
我如何在Model.create中使用这个select函数?
Model.create
返回一个包含已创建/插入文档的Promise。没有办法指定筛选选项来仅返回特定字段。.find()
与.select()
结合使用,但这将导致每次插入都会多出一个DB查询,这并不太合理。res.send({title: generatedEvent.title, description: generatedEvent.description});
Model.create()
内部并不会从数据库中获取文档,而是实际上返回结果,无论是否成功插入。如果成功,mongoose
将返回 mongoose 在发送到数据库之前创建的原始 mongoose 文档。
因此,您可以自己选择字段。使用 es2015 的 Object destructuring assignment 和 Object shorthand property names 可以帮助编写更简洁的代码。
const { title, description } = await Event.create(req.body); // Object destructuring
res.send({ title, description }); // Object shorthand property names
很遗憾,“projection”不能使用create
完成,但是一旦create
返回新文档,delete
关键字可以用于删除任意字段。 然而,这里有一个陷阱,delete
无法在Mongoose文档对象上工作,因为它们的属性被配置为不可删除(如果您想知道如何做到这一点,请阅读此link )。
幸运的是,Mongoose提供了一个toObject()
方法,可以将Mongoose文档对象转换为普通的Javascript对象。使用它,delete
关键字也必须起作用,因此可以删除任何字段(属性)。例如:
const doc = await Doc.create(req.body);
const _doc = doc.toObject();
delete _doc._id;
delete _doc.isTrashed;
// etc.