Mongoose - 在Model.create中选择特定字段

7
 const generatedEvent = await Event.create(req.body);
 res.send(generatedEvent);

我从请求的主体中获取一些数据,并可以生成一个新的事件。当事件生成后,我将其返回给客户端。但我不想返回事件的所有字段,我想进行过滤操作,类似于我们使用选择函数的方式:

Event.find().select({title:1,description:1})

我如何在Model.create中使用这个select函数?


这个创建函数无法指定返回字段,所以您想要返回特定的字段,例如:res.send({ title: generatedEvent.title }); - chenc
3个回答

3
如果您查看mongoose源代码,您会发现Model.create返回一个包含已创建/插入文档的Promise。没有办法指定筛选选项来仅返回特定字段。
当然,在创建/插入新记录后,您可以使用.find().select()结合使用,但这将导致每次插入都会多出一个DB查询,这并不太合理。
相反,您可以从返回的文档中返回所需的属性,因为当Promise解析时,您知道已成功插入具有提供的数据的新文档。因此,您只需执行以下操作即可:
res.send({title: generatedEvent.title, description: generatedEvent.description});

1

Model.create() 内部并不会从数据库中获取文档,而是实际上返回结果,无论是否成功插入。如果成功,mongoose 将返回 mongoose 在发送到数据库之前创建的原始 mongoose 文档。

因此,您可以自己选择字段。使用 es2015 的 Object destructuring assignmentObject shorthand property names 可以帮助编写更简洁的代码。

const { title, description } = await Event.create(req.body); // Object destructuring
res.send({ title, description }); // Object shorthand property names

0

很遗憾,“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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接