sql >> Database >  >> NoSQL >> MongoDB

Hoe het laatste bericht van een chatgesprek in mongodb te krijgen

Het probleem is hoe berichten worden stored .

Gegevens opgeslagen:

fromUser 123 and toUser 456
fromUser 456 and toUser 123

Dus als je het groepeert, zijn ze logisch dezelfde , maar not for grouping .

Oplossing:

We moeten ervoor zorgen dat de afzender / ontvanger altijd op dezelfde manier komt

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"
      }
    }
  }
])

Resultaat

[
  {
    "_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. Hoe haal je alle sleutels die overeenkomen met een specifiek patroon uit een hash in redis?

  2. Nodejs + Mongo db verbinden met serverdatabase met gebruikersnaam en wachtwoord

  3. Eerste element in array ophalen en retourneren met Aggregate?

  4. Meerdere waarden retourneren met Go Mongo Distinct