MongoDB:请求一个带有“select:false”的字段以及所有标准字段

Posted

技术标签:

【中文标题】MongoDB:请求一个带有“select:false”的字段以及所有标准字段【英文标题】:MongoDB: Request a field with "select: false" along with all standard fields 【发布时间】:2021-06-30 11:53:16 【问题描述】:

假设我们有一个用户架构:

name: String,
email: String,
mobile:  type: String, select: false 

db.User.findOne( email ) 返回name, email

说我也想请求mobile,我打电话给db.User.findOne( email , mobile: 1 )

不过,现在返回mobile。如果我想请求所有标准字段,并添加一些默认具有select: false 的特定字段怎么办?

实际上我有几十个这样的字段时调用db.User.findOne( email , name: 1, email: 1, mobile: 1 ) 是不合理的,并且必须在我的代码中进行类似的长时间调用。

谢谢!

【问题讨论】:

Mongo 要求您要么接受所有字段,要么列出您想要的字段,AFAIK 这些是您仅有的两个选项。 【参考方案1】:

使用.select('+mobile'),它会将 projection: mobile: 0 更改为 projection:

+,它强制包含路径,这对于在架构级别排除的路径很有用。

https://mongoosejs.com/docs/api.html#query_Query-select

指定要包含或排除的文档字段(也称为 查询“投影”)

使用字符串语法时,在路径前加上 - 将标记该路径 排除。当路径没有 - 前缀时,它被包含在内。 最后,如果路径以 + 为前缀,则强制包含该路径, 这对于在架构级别排除的路径很有用。

投影必须是包含或排除的。换一种说法, 您必须列出要包含的字段(不包括所有 其他),或列出要排除的字段(这意味着所有其他字段 被包含在内)。 _id 字段是唯一的例外,因为 MongoDB 默认包含它。

db.User.findOne( email ).select('+mobile')

【讨论】:

以上是关于MongoDB:请求一个带有“select:false”的字段以及所有标准字段的主要内容,如果未能解决你的问题,请参考以下文章

Express.js的PUT请求没有更新MongoDB。

$push 到带有 mongoose 的 MongoDB 中的数组不起作用

在将它们添加到 MongoDB 之前,如何在 Spring Data 中处理插入请求?

如何使用可选参数创建端点? (节点、快递、MongoDB)

使用setInverval对nodejs执行GET请求?

如何有效地关闭 MongoDB changeStream?