2017-02-08 2 views
0

У меня возникли проблемы с получением данных из различных моделей в MongoDB, чтобы проиллюстрировать это лучше, чтобы дать пример:Извлечение данных из разных моделей в MongoDB

Модель A: имеет идентификатор, название, описание

Модель B: имеет id, model_A_id, slug, фотографии

То, что я пытаюсь сделать, - это получить 3 последних записей из модели B и их соответствующие связанные данные из модели A из файла модели B, вот пример того, что я пытался кодировать

modelB.getLatest = function(limit){ 
 
\t var results = q.defer(); 
 

 
\t var limit = parseInt(limit) || 3; 
 
\t var resultsArr = []; 
 

 
\t modelB.find(function(err, modelB_Records) { 
 
\t \t if (err){ 
 
\t \t \t results.reject(err); 
 
\t \t } 
 
\t \t 
 
\t \t if (modelB_Records) { 
 
\t \t \t return modelB_Records; 
 
\t \t } 
 
\t }).sort({'date': -1}).limit(limit).then(function(modelB_Records) { 
 
\t \t modelB_Records.forEach(function(record) { 
 
\t \t \t modelA.findById(modelB.model_A_id).then(function(modelA_Record) { 
 
\t \t \t \t var resultsObj = { modelB_data: record, modelA_data: modelA_Record}; 
 
\t \t \t \t resultsArr.push(resultsObj); 
 
\t \t \t }); 
 
\t \t }); 
 

 
\t \t results.resolve(resultsArr); 
 
\t }); 
 

 
\t return results.promise; 
 
}

я, вероятно, далеко отсюда, но я надеюсь, мой вопрос может привести к ответам, чтобы получить меня на правильном пути, спасибо за помощь!

Вот образец модели схемы тоже:

var modelA= new mongoose.Schema({ 
 
\t _id: Number, 
 
\t name: String, 
 
     developer: String, 
 
     floors: Number, 
 
     completionYear: Number 
 
}); 
 

 
var modelB= new mongoose.Schema({ 
 
\t userId: String, 
 
\t buildingId: Number, 
 
\t date: String, 
 
\t title: String, 
 
\t description: String, 
 
\t comments: [], 
 
\t rating: [] 
 
});

+0

Вы уже проверили из [заполнить] (http://mongoosejs.com/docs/populate.html) от мангуста? –

+0

Я вижу, что вам не хватает '.exec()' сразу после '.limit (limit)'. Можете ли вы также добавить некоторые примеры документов из базы данных и ожидаемых данных? –

+0

добавлено @ThomasBormans – therayess

ответ

0

Вот ваши обновленные модели:

// Create schema for A 
var SchemaA = new mongoose.Schema({ 
    // No need to create _id manually, just use the ObjectId from MongoDB 
    name: String, 
    developer: String, 
    floors: Number, 
    completionYear: Number 
}); 
// Make model of schema for A 
var SchemaAModel = mongoose.model("SchemaA", SchemaA); 
// Export the model so you can require it somewhere else 
module.exports = SchemaAModel; 

// Create schema for B 
var SchemaB = new mongoose.Schema({ 
    userId: String, 
    buildingId: { 
     type: String, 
     ref: "SchemaA" // Make a ref to A, this is the mongoose model value 
    }, 
    date: String, 
    title: String, 
    description: String, 
    comments: [], 
    rating: [] 
}); 
// Make model of schema for B 
var SchemaBModel = mongoose.model("SchemaB", SchemaB); 
// Export the model so you can require it somewhere else 
module.exports = SchemaBModel; 

Прежде всего, вам необходимо создать несколько записей для первая модель (A). При создании их из узла с помощью Mongoose, _id будет сгенерирован автоматически. Затем создайте несколько записей для вашей второй модели (B). При установке buildingId, вам нужно будет ввести _id от модели А.

Например:

Запись для модели A:

{ 
    _id: ObjectId("562f51655b05e93371af9291"), 
    name: "Some name", 
    developer: "Some developer", 
    floors: 5, 
    completionYear: 2017, 
} 

Запись для модели B:

{ 
    userId: "Some user id", 
    buildingId: "562f51655b05e93371af9291", // This is the _id from the record above 
    date: "2017-02-08", 
    title: "Some title", 
    description: "Some description", 
    comments: [], 
    rating: [] 
} 

Когда все в базе данных, вы можете запросить вот так:

SchemaBModel 
    // You will need to update your find 
    .find() 
    // Set key(s) to populate 
    .populate("buildingId") 
    .exec() 
    .then(function onSuccess(response) { 
     // Here are your B items with populated A items 
    }); 

Ваш ответ в конце будет выглядеть следующим образом:

{ 
    userId: "Some user id", 
    buildingId: { 
     _id: ObjectId("562f51655b05e93371af9291"), 
     name: "Some name", 
     developer: "Some developer", 
     floors: 5, 
     completionYear: 2017, 
    }, 
    date: "2017-02-08", 
    title: "Some title", 
    description: "Some description", 
    comments: [], 
    rating: [] 
} 
+0

Спасибо Томас, я пытаюсь реализовать этот код, имея одну проблему, я отделил свои модели от разных файлов, поэтому, например, у меня есть внутри model_a.js модель, схема и функции, и я экспортирую функции, которые я ставил внутри объекта, то у меня есть model_b.js, где у него есть своя схема и модели, и все ... поэтому, когда я пытаюсь реализовать ваше решение, я экспортировал объект модели из model_a и импортировал его внутри model_b.js и использовал его в ref buildingId, когда я делаю это, я получаю сообщение об ошибке: schema hasn't была зарегистрирована для model_a – therayess

+0

@therayess Я бы предложил поместить вашу схему и модель в один файл, а ваши функции в другой файл , Это позволяет экспортировать вашу модель и требовать ее там, где это необходимо. Я обновил свой ответ, показывая, как его экспортировать. Тогда вы можете просто «var ModelA = require (« ./ path/to/model »);'. Это может решить проблему. –

+0

Perfect @ThomasBormans! Работало красиво, спасибо! – therayess

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