首页 > 解决方案 > 在猫鼬模式中填充嵌套对象的字段

问题描述

我有这两个模型

var postSchema = new Schema({
  content : String,
  author : [{
    user : {
    type: Schema.ObjectId,
    ref: 'user'
    },
    bool: Boolean
  }]
});


var userSchema = new Schema({
  name : String
});

我正在尝试使用用户名填充 Post 而不是仅显示 [Object] 或 id 如果 i .toString 它

我现在得到的是:

{ author: [ [Object], [Object], [Object] ],
    _id: 5aedc4d3c534213279faec79,
    content: 'hello',
    __v: 0 } ]

使用 .toString() 我得到

{ author: 
   [ { _id: 5aedc364ce3b022d4ff74922,
       user: 5aedb9e47e055d1ac26aa572,
       bool: true } ]

我想要的是 :

{ author: 
   [ { _id: 5aedc4d3c534213279faec7c,
       user: "Some name here", //( name instead of user _id )
       bool: true },
     { _id: 5aedc4d3c534213279faec7b,
       user: "Some name here",
       bool: false },
     { _id: 5aedc4d3c534213279faec7a,
       user: "Some name here",
       bool: true } ],
  _id: 5aedc4d3c534213279faec79,
  content: 'hello',
  __v: 0 }

这可能吗 ?

标签: node.jsmongodbmongoosemongoose-populate

解决方案


您可以使用带有嵌套语法的填充方法

const Post = mongoose.model('Post', postSchema);
const User = mongoose.model('User', userSchema);

Post
    .find({})
    .populate({path:'author.user', 'model':'User'})
    .exec((err, posts) => {
        if (err) return next(err);
        posts.forEach(post => {
          console.log(JSON.stringify( post, null, 2) ); // spacing level = 2
        }
    });

将为每个帖子输出(这不完全是您所需要的,但希望您可以在User格式上有灵活性

{ 
  _id: 5aedc4d3c534213279faec79,
  content: 'some content',
  author: [ 
    {
    user: {_id: 5aedc4d3c534213279faec7c, "user name here"}
    bool: true 
    },
    {
    user: {_id: 5aedc4d3c534213279faec7b, "user name 2 here"}
    bool: true 
    }
__v: 0 
}

参考 mongoose.populate http://mongoosejs.com/docs/populate.html


推荐阅读