将 select: false 设置为 mongoose 的子文档数组

Posted

技术标签:

【中文标题】将 select: false 设置为 mongoose 的子文档数组【英文标题】:Set select: false to subdocuments array at mongoose 【发布时间】:2014-02-26 09:05:04 【问题描述】:

在 mongoose 上有一个不错的选项,默认使用 select: false 选项从查询中删除一些字段。

例如:

var FileSchema = new Schema(
  filename: String,
  filesize: Number,
  base64Content: type: String, select:false
);

[...]

FileModel.find(, function(err, docs) 
  // docs will give me an array of files without theirs content
);

现在,如何对子文档数组的字段使用相同的选项?

(即在以下示例中,将select: false 设置为comments 字段)

var PostSchema = new Schema(
  user: ObjectId,
  content: String,
  createdAt: Date,
  comments: [
    user: ObjectId,
    content: String,
    createdAt: Date
  ]
);

[...]

FileModel.find(, function(err, docs) 
  // docs will give me an array of files without theirs content
);

【问题讨论】:

【参考方案1】:

先尝试创建一个 CommentSchema,

var CommentSchema = new Schema(
  user: ObjectId,
  content: String
  //whatever else
);

然后在你的 PostSchema 中指定

comments:  type: [CommentSchema], select:false

【讨论】:

【参考方案2】:

你可以这样做:

comments:  type: Array, default: [], select: false 

但是你会丢失下面声明的结构,否则真的有什么问题:

comments: [
    user:  type: ObjectId, select: false ,
    content:  type: String, select: false 
    createdAt:  type: Date, select: false 
]

这可能看起来有点简洁,但可能有人认为它是明智的。

【讨论】:

第二个选项在大多数情况下没有用。当你想选择整个数组时会发生什么?我想你应该分别选择每个字段 - 这是一个糟糕的设计.. 不像我解释的文档那样。是的,它看起来代码很难看,但是通过快速的谷歌搜索,您尝试使用这些设置获取整个数组,整个数组将被省略。除非你明确要求。

以上是关于将 select: false 设置为 mongoose 的子文档数组的主要内容,如果未能解决你的问题,请参考以下文章

mongo数据更新

如何将默认选择值设置为多选

mongoose index

如何将默认时间设置为当前时间 mongo 模式?

mongo 将 maxDistance 设置为集合中的值

使用 mongoose 将 mongo 对象的字段设置为空