Mongoose请求id字段返回id和_id

3

在我的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字段。为什么会这样,如何阻止它?
2个回答

6

find()函数内可以传递两个参数(criteria和projection)。Projection指的是您想要(或不想要)的字段。在您的情况下,您可以将您的代码更改为

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

而且它应该能够做到这一点。


太神奇了,我从来不知道你可以这样做!非常感谢。 - CaribouCode
2
@Coop 你也可以在现有的 select 调用中添加 -_id,这样就变成了 Job.find().select("-_id id title") - JohnnyHK
当我尝试执行{_id:0, id: 1}时,投影正确地仅包括"id"字段,但它被设置为null?当我将其更改为{_id:1, id: 1}时,“id”属性显示了正确的值,但我当然不想在投影中包含_id字段。奇怪的行为。 - chrismacp

6

在架构层面上,有一个选项可以防止 id 的使用。对我而言,这个方法非常有效。

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

Mongoose 文档


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接