Mongoose 请求 id 字段返回 id 和 _id

Posted

技术标签:

【中文标题】Mongoose 请求 id 字段返回 id 和 _id【英文标题】:Mongoose request for id field returns id and _id 【发布时间】:2015-03-06 13:41:25 【问题描述】:

在我的 Mongoose 架构中,我有一个 id 字段,每个文档都有一个唯一的 ID。这与默认 _id 字段使用的系统相同,如下所示:

var JobSchema = new mongoose.Schema(
  id:  type:String, required:true, unique:true, index:true, default:mongoose.Types.ObjectId ,
  title:  type: String ,
  brief:  type: String 
);

module.exports = mongoose.model("Job", JobSchema);

现在,如果我查询架构以获取 id 和标题,我会这样做:

Job.find().select("id title").exec(function(err, jobs) 
  if (err) throw err;
  res.send(jobs);
);

但是,我发现这会按预期返回 idtitle,但它也返回默认的 _id 字段。为什么会这样?我该如何阻止它?

【问题讨论】:

【参考方案1】:

find() 函数中,您可以传递两个参数(条件和投影)。投影是您想要(或不想要)的字段。在您的情况下,您可以将代码更改为

Job.find(, _id:0, id: 1, title: 1, function(err, jobs) 
    if (err) throw err;
    res.send(jobs);
);

它应该这样做。

【讨论】:

太棒了,我从来不知道你能做到这一点!非常感谢 @Coop 您也可以将-_id 添加到现有的select 调用中,使其成为Job.find().select("-_id id title") 当我尝试这样做_id:0, id: 1 时,投影正确地只包含“id”字段,但它设置为空?当我将其更改为_id:1, id: 1 时,“id”属性会显示正确的值,但我当然不希望投影中的 _id 字段?奇怪的行为。【参考方案2】:

有一个选项可以阻止模式级别的 id。 对我来说,这非常好。

new Schema( name: String ,  id: false );

Mongoose Docs

【讨论】:

这对我来说效果更好,尤其是在使用虚拟和填充时

以上是关于Mongoose 请求 id 字段返回 id 和 _id的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 在结果的 _id 字段中返回“new ObjectId”

mongoose findById 返回 null 并且 id 作为对象 id 存储在数据库中

Mongoose 从其他字段创建自定义 _id

使用 Mongoose 在投影中包含 Mongodb“_id”字段

使用 Mongoose 在投影中包含 Mongodb“_id”字段

MongoDB (Mongoose) 如何使用 $elemMatch 返回所有文档字段