Включить несвязанную коллекцию в результат модели - PullRequest
0 голосов
/ 19 января 2019

Я новичок в MongoDb и Mongoose, и это может звучать глупо, но я немного озадачен тем, как все работает.

У меня есть две несвязанные модели: page модель и team модель, которая выглядит примерно так:

// page.js

const mongoose = require('mongoose');

const schema = new mongoose.schema({
  name: String,
  body: {
    title: String,
  },
});
const Page = mongoose.model('Page', schema);

export default Page;

и

// team.js

const mongoose = require('mongoose');

const schema = new mongoose.schema({
  name: String,
  position: Number,
});
const Team = mongoose.model('Team', schema);

export default Team;

То, что я хочу сделать, - это найти одну страницу (Page.findOne({...})) для включения всех команд. Результат будет выглядеть так:

{
  _id: 'some_id',
  name: 'some name',
  body: {
    title: 'A title',
    teams: [
      { name: 'Team1', position: 1 },
      { name: 'Team2', position: 2 },
      // ...
      { name: 'Team3', position: 3 },
    ],
  },

}

Я посмотрел на populate, но для этого нужны ссылки на другие модели. Посмотрел virtuals, но насколько я понимаю, это должно работать только со свойствами экземпляра.

Каким будет наилучший подход для достижения этой цели без добавления отношений между двумя моделями?

Это я сейчас и делаю:

const pageResult = await Page.findOne({});
let page = pageResult.toObject();
page.body.team = await Team.find({});

1 Ответ

0 голосов
/ 19 января 2019

без ссылок, единственный способ сделать это - вручную запросить модель страницы и findOne () , какой документ вы хотите, и затем внутри обратного вызова этого findOne (), у вас будет чтобы получить желаемые команды со значением Page.body.title.

Но его очень легко использовать Ref и заполнить его с помощью мангусты, но если вы действительно хотите пойти таким образом, вырубите себя, приятель ... :) ура ...

Page.findOne({_id:req.body.id},(err,page)=>{
    if(!err){
        team.find({},(err,teams)=>{ // this will give you an array of teams 
            if(!err){
                   page.body.teams = teams; // this line set teams array from this callback to previous findOne()'s page obj
                                      //so that you will finally create the object you want             
            }else{
                throw err;
            }
        });
    }else{

    }
});

поскольку у вас есть только 2 поля в модели команды, я думаю, вам не нужно будет использовать проекции

...