首页 > 解决方案 > 在 MongoDB 查询中混合来自 MySQL 的数据?

问题描述

我在 MongoDB 中有以下查询,它选择用户参与的最后 10 个对话。它们根据对话中的最后一条消息进行排序。我有一种方法可以在 match 语句中使用 $gt 在结果之间进行分页。目前,这已被注释掉。

我将成员数量限制为 3(使用切片),因为群组对话可以包含例如 30、40、50、...成员。

问题:我有一个 MySQL 数据库来存储关系信息。所以我有一张桌子users和一张桌子followers,以显示谁在互相关注。我想以某种方式将此信息包含到 MongoDB 中,这样我就可以找到我关注的 3 个成员,以显示已知人的相关个人资料图片。假设我与 50 个成员进行了对话,然后我想检索我关注的 3 个人(如果有的话),所以我看到了熟悉的个人资料图片。这在某种程度上是可能的,还是我的愿望不可能?

询问

db.getCollection('conversations').aggregate([
    {
      $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
      }
    },
    {
      $match: {
        "members.uID": "1",
        //"lastMessage.t": { $gt: ISODate("2020-02-04 20:38:02.154Z") }
      }
    },
    {
      $sort: { "lastMessage.t": 1 }
    },
    {
      $limit: 10
    },
    {
      $project: {
        members: {
          $slice: [ {
            $filter: {
              input : "$members", as : "member", cond : {
                $ne : ["$$member.uID" , "1"]
              }
            }
          }, 3 ]
        }
      }
    },
  ])

对话文件

{
    "_id" : ObjectId("5e35f2c840713a43aeeeb3d9"),
    "members" : [ 
        {
            "uID" : "1",
            "j" : 1580580922
        }, 
        {
            "uID" : "4",
            "j" : 1580580922
        }, 
        {
            "uID" : "5",
            "j" : 1580580922
        }
    ]
}

消息文件

{
    "_id" : ObjectId("5e35ee5f40713a43aeeeb1c5"),
    "c_ID" : ObjectId("5e35f2c840713a43aeeeb3d9"),
    "fromID" : "1",
    "msg" : "What's up?",
    "t" : 1580591922,
    "d" : {
        "4" : 1580592039
    },
    "r" : {
        "4" : 1580592339
    }
}

标签: mysqlmongodbaggregation-framework

解决方案


推荐阅读