繁体   English   中英

如何从Mongodb到Mongoose的嵌套文档中获取Nodejs中的数组?

[英]How to get an Array in Nodejs from a nested document in Mongodb through Mongoose?

我试图从一个mongoose Model对象中获取数组形式的电子邮件。 所以我可以在查询中循环数组并按时间排序顺序获取其他用户的所有帖子,我是节点JS和Javascript的新手。 这是代码和架构:

这是架构:

var userSchema = mongoose.Schema({

_id:                {type: String, default: mongoose.Types.ObjectId()},
email:              {type: String},
userProfile:       userProfileSchema
});

var userProfileSchema = mongoose.Schema({

friendNetwork:      [{

"email": String, 
"chatId": String, 
"name": String

}],

posts:              [{
                        "_id" : {type: String, default: mongoose.Types.ObjectId()},
                        "postCreator" : String,
                        "isShared" : {type: String, default: ""},
                        "timestamp": String,
                        "text": String,
                        "images": [String],
                        "videos": [String],
                        "likes": [String],
                        "comments": [{

                            "status": {type: Boolean, default: true},
                            "commentId" : {type: String, default: mongoose.Types.ObjectId()},
                            "commentCreator": String,
                            "comment": String,
                            "timestamp": String,

                        }],
                        "shares": [String],
                        "isDelete" : {Boolean, default: false},
                        "isOnlyMe": {Boolean, default: false}

                    }],

isDelete:           {type: Boolean, default: false}
});

我尝试了map函数但是,我收到错误“TypeError:无法读取属性'map'的null”。

这是代码:

app.get('/newsfeed/getfeed', (req, res, err) => {

try
{
    // active user email in query
    userModel.findOne({email: req.query.email}, (user) => { 

    // array to get email of all active user's friends
    let userEmails = user.map(user => user.userProfile.friendNetwork.email);       

    //traverse through all friends and get their respective posts shared with friends
    userModel.find({email : { $in: userEmails }}, (err,users) => {

            users.userProfile.posts.find({ isOnlyMe: false }, (posts) => {
                // Mongo Atlas already ordered by timestamp, no need to add further sorting
                res.send(posts);
            });
        });                    
    });  
}
catch 
{
    console.log(err);
    logger(err, "Getting newsfeed of main page failed.");
}  

});

回调中提供的第一个参数通常是错误值。 您应该将代码行更改为:

userModel.findOne({email: req.query.email}, (err, user) => {

您可以在此处查看该功能的文档: https//mongoosejs.com/docs/api.html#model_Model.findOne

找到解决方案,显然我没有将数组传递给map函数。 map函数只接受并通过数组工作。

app.get('/newsfeed/getfeed', (req, res, err) => {

try
{
    // active user email in query
    userModel.findOne({email: req.query.email}, (err,user) => { 

    // array to get email of all active user's friends
    ***let userEmails = user.userProfile.friendNetwork.map((friend) =>{***
        return friend.email;
    });       

    userEmails.push(req.query.email);

    console.log(userEmails);        
    //traverse through all friends and get their respective posts shared with friends
    userModel.find({ email: { $in: userEmails }}, (err,users) => {

            console.log(users);
            users.userProfile.posts.find({ isOnlyMe: false }, (err,posts) => {
                // Mongo Atlas already ordered by timestamp, no need to add further sorting
                res.send(posts);
            });
        });                    
    });  
}
catch 
{
    console.log(err);
    logger(err, "Getting newsfeed of main page failed.");
}
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM