node.js - Mongoose Populate Method 不填充值

标签 node.js mongoose mongoose-populate

我有两个 Mongoose 架构如下

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);

}

但它不起作用,并且没有填充现有子类型对象中的任何值。

我承认我的方法可能是非常错误的,因为我对这项技术还很陌生。感谢任何类型的帮助来按预期运行这段代码。

谢谢 欢乐

最佳答案

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

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

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

根据以下评论进行更新

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

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

看起来像这样:

// 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 设置为“user”,因为我在下面的 mongoose.model 方法调用中将我的模型注册为“user”。

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

关于node.js - Mongoose Populate Method 不填充值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36185713/

相关文章:

mongodb - NestJS + Mongoose + GraphQL : "populate" not working

javascript - 在 Node 服务器中部署 ext js 应用程序时出现错误

javascript - 重定向到 'console.log' 后无法使用 'alert'

node.js - MongoDB ensurIndex 和 createIndex 使用 nodeJS?

node.js - Mongoose - find({},cb) 和 find({}).exec(cb) 之间有什么区别?

node.js - MongoDB $ lookup vs Mongoose 填充

node.js - 结合 Typescript Koa-Router 和 Passport

javascript - UnhandledPromiseRejectionWarning错误使用axios

javascript - 在 where 子句中使用两个字段时的 Mongoose 转换问题

node.js - Mongoose 多重深度填充