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”的字段以及所有标准字段的主要内容,如果未能解决你的问题,请参考以下文章
$push 到带有 mongoose 的 MongoDB 中的数组不起作用