【问题标题】:Is there a way to only return fields defined within a Mongoose schema?有没有办法只返回在 Mongoose 模式中定义的字段?
【发布时间】:2017-02-02 01:56:34
【问题描述】:

假设我有一个集合People,其中包含以下文档:

{
   "name": "John",
   "age": 25,
   "gender": "male"
}

还有两个用于文档的 Schema,一个应该返回所有信息,另一个应该只返回信息的子集:

var Person = mongoose.Schema({ "name": String, "age": Number, "gender": String}, {collection: "People");
var PersonName = mongoose.Schema({ "name": String }, {collection: "People"});

如何让PersonName 只返回姓名?

目前,我有一个包含很多不必要信息的文档,并且希望在使用 .find() 时只返回数据的子集。我已经定义了一个模式并手动设置它的集合。与定义的Schema相反,它返回所有字段。

【问题讨论】:

  • 您对此有什么答案吗?我已经在我的 RefSchema 中手动设置了“select:false”的模式。但是有些模式太大而无法手动完成。如果字段发生更改,将需要维护 2 个或更多架构。

标签: node.js mongodb mongoose find schema


【解决方案1】:

无需定义另一个模式来从集合中获取特定属性。只需在 find() 函数中指定要返回的属性作为投影选项即可。

Schema.find(query,options,callbackFunction);

喜欢:

person.find({},{name:1}, function(err, docs) {//used name:1 to return only name
   if(error) {
      return res.status(400).send({msg: "error"});
   }
   return res.status(200).send(docs);
});

【讨论】:

  • 这可行,但有没有办法让它从架构中提取,因为我的架构有嵌套字段并且比我提供的示例更复杂。
  • 您可以在投影选项中选择嵌套对象,如{"name.firstName":1}。但是,您应该提供实际问题,然后我们可以提供完美的解决方案,否则您期望完美的解决方案。:)
  • 定义多个模式以从模式中获取某些字段并不是一个好主意。 (我的看法)
【解决方案2】:

我有一个在参考架构上使用“select: false”的想法。我们仍然需要列出/定义所有相关字段。

例如,

{
   "name": "John",
   "age": 25,
   "gender": "male"
}
var Person = mongoose.Schema({ "name": String, "age": Number, "gender": String}, {collection: "People");
var PersonRef = mongoose.Schema({ "name": String, "age": { type: Number, select: false }, "gender": { type: String, select: false },} {collection: "People"});

但是这种方法仅适用于(或有用)当模式相对较小以进行可维护性时。如果 schema 变大,那么我们需要在两个(或多个 schema)中设置 select: false 以避免在 RefSchema 中自动选择。

我仍在寻找更好的解决方案来处理这个问题。

【讨论】:

    猜你喜欢
    • 2021-02-05
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2022-07-22
    • 1970-01-01
    相关资源
    最近更新 更多