Метод заполнения мангуста не заполняет значение

У меня есть две схемы мангуста, как показано ниже

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, а затем одновременно пытаюсь заполнить "serviceSubTypeId" объекта ServiceType, на который имеется ссылка на созданный ServiceSubType.

Вот мой фрагмент кода для той же цели.

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

}

Но это не работает и не заполняет какое-либо значение в существующем объекте подтипа.

Я признаю, что мой подход может быть очень неправильным, поскольку я новичок в этой технологии. Благодарим за любую помощь в выполнении этого фрагмента кода должным образом.

Спасибо Ajoy


person ajoy sinha    schedule 23.03.2016    source источник


Ответы (1)


Я думаю, ваш ref должен быть таким же, как collection на объекте

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

Mongoose ничего не знает о ваших типах объектов JavaScript. Вместо этого он отслеживает вещи на основе collection имени, которое вы указываете (или которое оно генерирует).

обновление на основе комментариев ниже

У меня есть пример кода, который я написал некоторое время назад, и похоже, что я разрешаю 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 и указываете имя? если да, используйте это имя.

person Derick Bailey    schedule 23.03.2016
comment
Я пробовал это .. но он выдает ошибку как новый MongooseError.MissingSchemaError (name); ^ MissingSchemaError: Схема не зарегистрирована для модели SERVICE_SUB_TYPES. - person ajoy sinha; 23.03.2016
comment
Я обновил свой ответ некоторым образцом кода, который написал некоторое время назад. надеюсь, это поможет. - person Derick Bailey; 23.03.2016