【问题标题】:Mongoose request for id field returns id and _idMongoose 请求 id 字段返回 id 和 _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 字段。为什么会这样?我该如何阻止它?

【问题讨论】:

    标签: javascript json node.js mongodb mongoose


    【解决方案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

    【讨论】:

    • 这对我来说效果更好,尤其是在使用虚拟和填充时
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 2019-05-08
    • 2012-03-30
    • 2023-01-21
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多