2015-08-31 6 views
0

Так .. Мне было интересно, если в Мангусте я мог бы сделать что-то вроде этого:Mongoose: Установка поля в схеме, используя поисковый запрос

var Match = require('./models/Match);  

ClubSchema = new mongoose.Schema({ 
    _id: {type: String, required: true, unique: true}, 
    name: {type: String, required: true, unique: true}, 
    playedMatches: //Search query for played matches here (so like Match.find()) 
}); 

Так что я хочу поле playedMatches быть заполнено, когда я использую запрос поиск в клубе. Сейчас я использую своего рода «типа, как Singleton», чтобы заполнить поле playedMatches следующим образом:

ClubSchema.playedMatches = null; 

ClubSchema.methods.setPlayedMatches = function (callback) { 
    var self = this; 
    Match.find({$or: [{homeClub: self._id}, {awayClub: self._id}], matchOver: true}).sort({playDate: 'asc'}).exec(function (err, matches) { 
    if (err) { 
     callback(err); 
    } else { 
     self.playedMatches = matches; 
     callback(false, matches); 
    } 
    }); 
}; 

ClubSchema.methods.getPlayedMatches = function (callback) { 
    if (!this.playedMatches) { 
    this.setPlayedMatches(function (err, matches) { 
     if (err) { 
     callback(err); 
     } else { 
     callback(false, matches); 
     } 
    }); 
    } else { 
    callback(false, this.playedMatches); 
    } 
}; 

Но потому, что я хочу, чтобы идти асинхронно, что на самом деле не работает, и я не хочу иметь вызвать метод, чтобы установить поле playedMatches первым, прежде чем я использовать любую другую функцию, которая использует причину playedMatches поля хорошо .. это просто некрасиво тоже ..

MatchSchema выглядит следующим образом:

var MatchSchema = new mongoose.Schema({ 
    _id: {type: String, required: true, unique: true}, 
    homeClub: {type: String, ref: 'Club'}, 
    awayClub: {type: String, ref: 'Club'}, 
    playDate: {type: Date, required: true}, 
    goalsHomeClub: {type: Number}, 
    goalsAwayClub: {type: Number}, 
    matchOver: {type: Boolean, default: false} 
}); 

Thnx заранее !

+0

ли playedMatches хранящегося в другой коллекции? Отправьте код, который вы используете в настоящее время. – ZeMoon

+0

Да, они хранятся в коллекции «спички», а клубы хранятся в коллекции «клубы». – user3081076

+0

Не могли бы вы опубликовать схему и код модели для коллекции матча? – ZeMoon

ответ

1

У Mongoose есть встроенный способ для этого: populate.

Все, что вам нужно сделать, это указать название модели в поле ref поля спецификации поля. Имя модели должно быть таким же, как указано в методе Mongoose.model.

ClubSchema = new mongoose.Schema({ 
    _id: {type: String, required: true, unique: true}, 
    name: {type: String, required: true, unique: true}, 
    playedMatches: [{type: ObjectId, ref: 'Match'}] 
}); 

Теперь вы можете заполнить матчи в поле автоматически после запроса со следующим кодом:

Club.find({}).populate('playedMatches'); 
+0

Thnx для вашего быстрого ответа! Я знаком с населением. Однако я не могу использовать это для выполнения этой работы. Populate всегда смотрит на id другого объекта. Кроме того, я не хочу, чтобы все соответствующие соответствия были для клуба в его объекте. Это не делает вещи намного более гибкими. – user3081076

+0

Я понимаю, что вы пытаетесь сделать, и я думаю, что вы уже реализовали его наилучшим образом. Вы не можете определить виртуальное поле, так как они не могут быть асинхронными. – ZeMoon

+0

Darn * t! Я боялся этого! Это просто не так. О, хорошо, большое вам спасибо за ваше время! – user3081076

 Смежные вопросы

  • Нет связанных вопросов^_^