猫鼬-通过作者的ID查找模型

时间:2019-05-15 13:52:28

标签: mongodb mongoose

我试图通过作者的ID查找给定作者创建的所有帖子,但我一直得到一个空数组

下面是模型和获取请求

let campgroundSchema = new mongoose.Schema({
    name:String,
    image:String,
    location:String,
    lat:Number,
    lng:Number,
    price:String,
    description:String,
    createdAt: {type:Date, default:Date.now},
    author:{
        id:{
            type:mongoose.Schema.Types.ObjectId,
            ref:'User'
        },
        username:String,
    },
    comments:[{
        type:mongoose.Schema.Types.ObjectId,
        ref:'Comment'
    }]
});

let Campground = mongoose.model('campground',campgroundSchema);```

const userSchema = new mongoose.Schema({
    username:String,
    password:String,
    firstName:String,
    lastName:String,
    email:String,
    profileImage:String,
    isAdmin:{type:Boolean, default:false},
    followers:[
        {
            type:mongoose.Schema.Types.ObjectId,
            ref:'User'
        }
    ],
    notifications:[{
        type:mongoose.Schema.Types.ObjectId,
        ref:'Notification'
    }]
});

userSchema.plugin(passportLocalMongoose);
const User = mongoose.model('User', userSchema);

您好,我可以通过作者的ID获取给定作者的所有露营地数组吗?这个想法是使用用户模型中存储的用户详细信息以及该用户创建的帖子数来呈现一个用户个人资料页面

3 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,则您正在尝试通过作者ID返回所有露营地。如果是这种情况,则您的查询正在寻找错误的ID。

User.findById(req.params.id)

将在Mongo自动生成的本机_id上找到与用户集合匹配的文档。

如果要查找与作者ID匹配的露营地,您的查询应类似于:

User.find({ author.id: req.params.id })

希望这会有所帮助!

答案 1 :(得分:0)

帖子收集中的简单搜索

Post.find({author.id: req.params.id},(err, posts) => 
    {
       ....
    }) 

答案 2 :(得分:0)

我解决了。

router.get('/users/:id',(req,res) => {
     User.findById(req.params.id).populate('posts').exec((err,foundUser)=>{
        if (err) {
            req.flash('error_msg',"Something went wrong");
            res.redirect('/');
        } else {
            Campground.find({'author.id':foundUser.id},(err,foundUser_campgrounds)=>{
                res.render('users/show', {userProfile:foundUser, userCampgrounds:foundUser_campgrounds});
            });
        }

    });
});