MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Cách nhận tin nhắn cuối cùng từ cuộc trò chuyện trong mongodb

Vấn đề là cách các tin nhắn được stored .

Dữ liệu được lưu trữ:

fromUser 123 and toUser 456
fromUser 456 and toUser 123

Vì vậy, khi bạn nhóm nó, về mặt logic chúng giống nhau , nhưng not for grouping .

Giải pháp:

Chúng tôi cần đảm bảo rằng người gửi / người nhận luôn đến theo cùng một cách

1. Create array where we store sender / receiver
2. Order that array `[123, 456] [456, 123] => [123,456], [123,456]`
3. Group by this ordered array (In Mongo way: $project, $unwind, $sort, $group - push)
db.chats.aggregate([
  {
    $match: {
      $or: [
        {
          "toUser": 123
        },
        {
          "fromUser": 123
        }
      ]
    }
  },
  {
    "$project": {
      toUser: 1,
      fromUser: 1,
      message: 1,
      timeStamp: 1,
      fromToUser: [
        "$fromUser",
        "$toUser"
      ]
    }
  },
  {
    $unwind: "$fromToUser"
  },
  {
    $sort: {
      "fromToUser": 1
    }
  },
  {
    $group: {
      _id: "$_id",
      "fromToUser": {
        $push: "$fromToUser"
      },
      "fromUser": {
        "$first": "$fromUser"
      },
      "toUser": {
        "$first": "$toUser"
      },
      "message": {
        "$first": "$message"
      },
      "timeStamp": {
        "$first": "$timeStamp"
      }
    }
  },
  {
    "$sort": {
      "timeStamp": -1
    }
  },
  {
    "$group": {
      "_id": "$fromToUser",
      "fromUser": {
        "$first": "$fromUser"
      },
      "toUser": {
        "$first": "$toUser"
      },
      "message": {
        "$first": "$message"
      },
      "timeStamp": {
        "$first": "$timeStamp"
      }
    }
  }
])

Kết quả

[
  {
    "_id": [
      101,
      123
    ],
    "fromUser": 123,
    "message": "Kk",
    "timeStamp": "2019-10-09 18:31:12:1212 PM +05:30",
    "toUser": 101
  },
  {
    "_id": [
      123,
      456
    ],
    "fromUser": 123,
    "message": "2",
    "timeStamp": "2019-10-09 18:31:21:2121 PM +05:30",
    "toUser": 456
  }
]

MongoPlayground




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongodb geoNear vs near

  2. Chỉ mục Mongoose trên một trường trong tài liệu lồng nhau

  3. Chuyển đổi chuỗi thành ngày tháng trong mongodb

  4. Tạo trường autoincrement duy nhất với mongoose

  5. Truy vấn tổng hợp Mongoose trả về nhiều bản ghi khi nó chỉ trả về một bản ghi