在模型结果中包括不相关的集合

时间:2019-01-19 01:49:07

标签: node.js mongoose mongoose-schema

我是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 :(得分:0)

没有引用,唯一的方法是手动查询Page模型和 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个字段,我认为您不需要使用预测