关于猫鼬填充关系字符串字段

tud*_*dou 5 mongoose mongodb node.js

我有两个模式

1-用户

UserSchema = new db.Schema({
    email:  {type: String, required: true},
    pass:   {type: String, required: true},
    nick:   {type: String, required: true},
    admin:  {type: String, default: ''},
    reg:    {type: Date, default: Date.now}
});
Run Code Online (Sandbox Code Playgroud)

2-文章

ArticleSchema = new db.Schema({
    title:      {type: String, required: true},
    alise:      {type: String},
    time:       {type: Date, defaults: Date.now},
    view:       {type: Number, defaults: 0},
    author:     {type: String},
    content:    {type: String},
    classes:    {type: db.Schema.Types.ObjectId, ref: 'Classes'},
    user:       {type: String, ref: 'User'}
});
Run Code Online (Sandbox Code Playgroud)

我想要ArticleSchema用户字段关系UserSchema昵称。

我的代码:

Model.findOne({}).populate('classes user').exec(function(err, res){
    if(err){
        cb(err);
    }else{
        cb(null, res);
    }
});
Run Code Online (Sandbox Code Playgroud)

这不行

message: 'Cast to ObjectId failed for value "tudou" at path "_id"'
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

dan*_*per 5

显然你在使用猫鼬,对吧?如果是,要做到这一点,您必须db.Schema.Types.ObjectIdArticleSchema用户字段中使用。因此,您的 ArticleSchema 应如下所示:

ArticleSchema = new db.Schema({
    title:      {type: String, required: true},
    alise:      {type: String},
    time:       {type: Date, defaults: Date.now},
    view:       {type: Number, defaults: 0},
    author:     {type: String},
    content:    {type: String},
    classes:    {type: db.Schema.Types.ObjectId, ref: 'Classes'},
    user:       {type: db.Schema.Types.ObjectId, ref: 'User'}
});
Run Code Online (Sandbox Code Playgroud)



根据文档:

MongoDB 中没有连接,但有时我们仍然希望引用其他集合中的文档。这就是人口的来源。


所以,看看这里,我们可以做这样的事情:

//To create one user, one article and set the user whos created the article.
var user = new UserSchema({
    email : 'asdf@gmail.com',
    nick : 'danilo'
    ...
});
user.save(function(error) {
    var article = new ArticleSchema({
        title : 'title',
        alise : 'asdf',
        user : user,
        ...
    });
    article.save(function(error) {
        if(error) {
            console.log(error);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)


并找到为 danilo 创建的文章:

ArticleSchema
.find(...)
.populate({
  path: 'user',
  match: { nick: 'danilo'},
  select: 'email nick -_id'
})
.exec()
Run Code Online (Sandbox Code Playgroud)



我建议你在这里阅读关于猫鼬的populate 信息