【问题标题】:Mongoose Populate Method is not populating valueMongoose 填充方法未填充值
【发布时间】:2016-07-11 04:32:24
【问题描述】:

我有两个猫鼬模式如下

var ServiceSubType = new Schema({

    displaySubTypeName          : String,
    subTypeDescription          : String,
    status                      : { type: String, default: Constants.ACTIVE },
    lastUpdatedOn               : Date,
    createdOn                   : { type: Date, default: Date.now }

} , { collection: 'SERVICE_SUB_TYPES' });

var ServiceType = new Schema({

    displayName         : String,
    description         : String,
    status              : { type: String, default: Constants.ACTIVE },
    lastUpdatedOn       : Date,
    serviceSubTypeId    : {type: Schema.Types.ObjectId, ref: 'ServiceSubType', index: true},
    createdBy           : { type: Schema.Types.ObjectId, ref: 'SystemUser', index: true },
    createdOn           : { type: Date, default: Date.now }

} , { collection: 'SERVICE_TYPES' });

我已经填充了如下的类型对象

module.exports.addNewServiceType = function(serviceType_obj, callback) {
    serviceType_obj.save(serviceType_obj,callback);
}

现在我正在尝试填充 ServiceSubType 文档,然后同时尝试填充引用创建的 ServiceSubType 的 ServiceType 对象的“serviceSubTypeId”。

这是我用于相同目的的一段代码。

module.exports.addServiceSubType = function(serviceTypeObjId, serviceSubType_obj, callback) {

    serviceSubType_obj.save(serviceSubType_obj, function (error, serviceSubType) {

    });


    serviceSchema.ServiceType.findById(serviceTypeObjId, function (err, serviceType) {

        var opts = { path: 'serviceSubTypeId'};

        serviceSchema.ServiceType.populate(serviceType, opts, function (err, user) {
            console.log(serviceType);
          });

    }).exec(callback);

}

但它不是 workign 并且没有填充现有子类型对象中的任何值。

我承认我的方法可能非常错误,因为我是这项技术的新手。感谢您按预期运行这段代码的任何帮助。

谢谢 开心

【问题讨论】:

    标签: node.js mongoose mongoose-populate


    【解决方案1】:

    我认为您的ref 应该与对象上的collection 设置相同

    serviceSubTypeId    : {
      type: Schema.Types.ObjectId, 
      ref: 'SERVICE_SUB_TYPES',  <==== your collection type goes here
      index: true
    },
    

    Mongoose 对您的 JavaScript 对象类型一无所知。相反,它会根据您提供(或它生成)的 collection 名称来跟踪事物。

    根据下面的 cmets 更新

    我有一些我不久前写的示例代码,看起来我让 Mongoose 为我生成集合名称。但是,在为集合注册我的类型时,我为 mogoose.model() 调用提供了一个名称。

    例如,我有一个Post 类型和一个User 类型。帖子包含一个author,它是对用户的引用。

    看起来像这样:

    // post
    // ----
    
    var PostSchema = new mongoose.Schema({
      date: {type: Date, required: true, default: Date.now},
      title: {type: String, required: true},
      content: {type: String, required: true},
      author: {
        type: SchemaTypes.ObjectId,
        ref: "user"
      },
      comments: [CommentSchema]
    });
    
    var Post = mongoose.model("blog", PostSchema);
    
    // user
    // ----
    
    var UserSchema = mongoose.Schema({
      firstName: {type: String},
      lastName: {type: String},
      username: {type: String, required: true, index: {unique: true}},
      email: {type: String, required: true},
      password: {type: String, required: true},
      url: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "url"
      }
    });
    
    User = mongoose.model("user", UserSchema);
    

    在此示例代码中,我将ref 设置为“用户”,因为我在下面的mongoose.model 方法调用中将我的模型注册为“用户”。

    您是否使用 mongoose.model 注册您的模型并提供名称?如果是这样,请使用该名称。

    【讨论】:

    • 我试过了..但它给出的错误是 new MongooseError.MissingSchemaError(name); ^ MissingSchemaError:尚未为模型“SERVICE_SUB_TYPES”注册架构。
    • 我用我不久前写的一些示例代码更新了我的答案。希望这会有所帮助。
    猜你喜欢
    • 2012-01-22
    • 2019-01-31
    • 2013-11-14
    • 2017-03-23
    • 2019-07-28
    • 2015-08-07
    • 2015-01-22
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多