【问题标题】:Retrieving data from MongoDB ánd MySQL simultaneously同时从 MongoDB 和 MySQL 检索数据
【发布时间】:2020-05-23 22:24:40
【问题描述】:

我正在尝试从存储聊天对话的 MongoDB 数据库中检索数据。这工作正常并返回我想要的。但是,我只在 MongoDB 中保存用户 ID,所以我需要从我的 MySQL 数据库中查询头像、用户名等。我尝试了以下方法:

app.get('/api/retrieveAllChats', (req, res) => {

    var Conversation = mongoose.model('Conversation', ConversationSchema);
    var ChatMessage = mongoose.model('Message', ChatMessageSchema);

    var userID = req.query.userID.toString()
    var members = []
    var conversationData = []

    var retrieveAllChats = new Promise(function(resolve, reject) {

        Conversation.aggregate([{ $match: { "members.uID": userID } }, { $lookup: { foreignField: "c_ID", from: "messages", localField: "_id", as: "messages" } }, { "$unwind": "$messages" }, { "$sort": { "messages.t": -1 } }, { "$group": { "_id": "$_id", "lastMessage": { "$first": "$messages" }, "allFields": { "$first": "$$ROOT" } } }, { "$replaceRoot": { "newRoot": { "$mergeObjects": [ "$allFields", { "lastMessage": "$lastMessage" } ] } } }, { "$project": { "messages": 0 } }], function (err, conversations) {
            if (err) return handleError(err);

            conversations.forEach((conversation, i) => {
                return new Promise(function (resolveConversations, rejectConversations) {
                    var membersPromise = conversation.members.forEach((member, x) => {
                        return new Promise(function (resolveUserData, rejectUserData) {
                            getUserData(member["uID"], function(userData) {
                                members.push({userID: member["uID"], joinDate: member["j"], userName: userData["userName"], userDisplayName: userData["userDisplayName"], userVerified: userData["userVerified"], userProfilePicURL: userData["userProfilePicURL"]})
                                console.log("userData: ", userData)
                                conversations[i].members[x].userData = userData
                                conversationData = conversations
                                resolveUserData({userID: member["uID"], joinDate: member["j"], userName: userData["userName"], userDisplayName: userData["userDisplayName"], userVerified: userData["userVerified"], userProfilePicURL: userData["userProfilePicURL"]})
                            })
                        })
                    })
                    resolveConversations()
                })
            })
            resolve()
        })

    }).catch(error => {

        console.log(error)
        res.json({ errorCode: 500 })

    })

    retrieveAllChats.then(function() {

        res.header("Content-Type",'application/json');
        res.send(JSON.stringify(conversationData, null, 4));

    })

})

但是,conversationData 数组始终为空。所以我需要一种方法来解决retrieveAllChats 承诺并将我添加到现有对话对象的数据传递给它以返回我需要的所有信息。关于如何做到这一点的任何想法? (getUserData 是一个检索 MySQL 数据的函数,这个函数可以正常工作并返回我想要的)

【问题讨论】:

    标签: mysql node.js mongodb


    【解决方案1】:

    您正在尝试在 forEach 内执行异步操作,但这是行不通的。您需要使用for...ofPromise.all

    此外,您可以通过在运行任何查询或聚合结束时使用 .exec() 来简化此代码,因为猫鼬支持。像这样的东西应该工作。确保将路由线更改为此以告知它是异步函数

    app.get("/api/retrieveAllChats", async (req, res) => {
    
    

    核心逻辑

    const conversions = await Conversation.aggregate([{"$match": {"members.uID": userID}}, {"$lookup": {"foreignField": "c_ID", "from": "messages", "localField": "_id", "as": "messages"}}, {"$unwind": "$messages"}, {"$sort": {"messages.t": -1}}, {"$group": {"_id": "$_id", "lastMessage": {"$first": "$messages"}, "allFields": {"$first": "$$ROOT"}}}, {"$replaceRoot": {"newRoot": {"$mergeObjects": ["$allFields", {"lastMessage": "$lastMessage"}]}}}, {"$project": {"messages": 0}}]);
      for(const conversation of conversations) {
        for(const member of conversation.members) {
          // add your promise call here and either await it or use then to get the promise value.
        }
      }
    

    【讨论】:

    • 如何重建我的承诺电话以适应那里?最后我将如何获得每个对话的所有结果?
    猜你喜欢
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2020-09-18
    • 1970-01-01
    • 2015-06-18
    • 2012-04-07
    相关资源
    最近更新 更多