【问题标题】:MongoDB: Request a field with "select: false" along with all standard fieldsMongoDB:请求一个带有“select:false”的字段以及所有标准字段
【发布时间】: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 这些是您仅有的两个选项。

标签: database mongodb mongoose mongodb-query mongoose-schema


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2014-06-23
    • 1970-01-01
    • 2021-01-01
    • 2014-08-09
    • 2021-10-16
    相关资源
    最近更新 更多